Suche…


Bemerkungen

Hinweise zu benutzerdefinierten Java-Klassenfeldern:

Dies ist ein kleiner Abschnitt eines umfangreichen Artikels, der in Solr anhand von externen Feldern sortiert wird, um Solr-Dokumente nach benutzerdefiniertem Feldvergleicher zu sortieren.

Hinweise zu benutzerdefinierten Feldern, die aus vorhandenen Solr-Feldern erstellt wurden:

Apache hat eine ausführliche Dokumentation zu diesem Thema erstellt - Grundlegendes zu Analysatoren, Tokenisierern und Filtern .

Erstellen Sie einen benutzerdefinierten Solr-Feldtyp aus der eigenen benutzerdefinierten Java-Klasse

Schemaänderungen:

Sie müssen in Ihrer Solr-Schemadatei einen neuen Feldtyp definieren. Anschließend können Sie Felder dieses Typs erstellen. Beispielschema-Snippet:

<!-- Source: solr/example/.../conf/schema.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="adam" version="1.3">
  <types>
    ...
    <fieldType name="rank_t" class="org.apache.solr.schema.ext.RankFieldType"/>
  </types>
 <fields>
   ...
   <field name="rank" type="rank_t" indexed="true" stored="true"/>
 </fields>
 ...
</schema>

Java-Klasse für benutzerdefinierten Feldtyp:

// Source: src/java/org/apache/solr/schema/ext/RankFieldType.java
package org.apache.solr.schema.ext;

import java.io.IOException;

import org.apache.lucene.document.Fieldable;
import org.apache.lucene.search.SortField;
import org.apache.solr.response.TextResponseWriter;
import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.SchemaField;
import org.apache.solr.search.ext.RankFieldComparatorSource;

public class RankFieldType extends FieldType {

    @Override
    public SortField getSortField(SchemaField field, boolean top) {
        return new SortField(field.getName(), new RankFieldComparatorSource(), top);
    }

    @Override
    // copied verbatim from GeoHashField method
    public void write(TextResponseWriter writer, String name, Fieldable f) throws IOException {
         writer.writeStr(name, f.stringValue(), false);
    }
}

Erstellen Sie einen benutzerdefinierten Feldtyp aus verfügbaren Feldtypen

Lassen Sie uns einige theoretische Kenntnisse erwerben, bevor Sie zum Beispiel übergehen. Hier werden drei wichtige Begriffe verwendet: Analysatoren , Tokenizer und Filter . Um ein solches benutzerdefiniertes Feld zu erstellen, müssen Sie ein Analysegerät mit einem Tokenizer und einem oder mehreren Filtern erstellen. Wie hier erwähnt, können Sie nur einen Tokenizer pro Analysator verwenden. Es gibt jedoch Möglichkeiten, diese Einschränkung zu überwinden.

<fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.TrimFilterFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" replace="all" replacement="" pattern="([^a-z])"/>
  </analyzer>
</fieldType>

Ein anderes Beispiel:

<fieldType name="lowercase_text" class="solr.TextField" positionIncrementGap="150">
  <analyzer>
     <tokenizer class="solr.KeywordTokenizerFactory" />
     <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldType>

Noch ein Beispiel mit Beschreibung:

<fieldType name="text_stem" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPorterFilterFactory"/>
  </analyzer>
</fieldType>

Dieses Beispiel beginnt mit dem Standard-Tokenizer von Solr, der den Feldtext in Token aufteilt. Diese Token durchlaufen dann den Standardfilter von Solr, der Punkte aus Akronymen entfernt und einige andere übliche Operationen durchführt. Alle Token werden dann auf Kleinbuchstaben gesetzt, was die Übereinstimmung von Groß- und Kleinschreibung zum Abfragen erleichtert. Der letzte Filter im obigen Beispiel ist ein Stemmerfilter, der den Porter-Stemming-Algorithmus verwendet. Ein Stemmer ist im Wesentlichen ein Satz von Abbildungsregeln, der die verschiedenen Formen eines Wortes auf das Basis- oder Stammwort abbildet, von dem sie abgeleitet sind. In Englisch sind beispielsweise die Wörter "Umarmungen", "Umarmen" und "Umarmt" alle Formen des Stammworts "Umarmung". Der Stemmer wird alle diese Begriffe durch "hug" ersetzen, was indiziert wird. Dies bedeutet, dass eine Abfrage nach "hug" dem Begriff "hugged" entspricht, aber nicht "riesig".

Beispiel für die Verwendung eines solchen benutzerdefinierten Feldes:

<field name="keywords" type="text_stem" indexed="true" stored="true" />

Liste der verfügbaren Tokenizer-Typen: Liste der Tokenizer-Typen

Liste der verfügbaren Filtertypen: Liste der Filtertypen



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow