Zoeken…


Opmerkingen

Opmerkingen over een aangepast op Java-klasse gebaseerd veld:

Dit is een klein gedeelte van een groot artikel aangepast sorteren in Solr met behulp van extern veld geschreven om Solr-documenten te sorteren op basis van aangepaste veldvergelijker.

Opmerkingen over aangepast veld gemaakt op basis van bestaande Solr-velden:

Apache heeft een gedetailleerde documentatie over dit onderwerp gemaakt - Analyzers, Tokenizers en filters begrijpen .

Maak een aangepast Solr-veldtype van de eigen aangepaste Java-klasse

Schema verandert:

U moet een nieuw veldtype definiëren in uw solr-schemabestand en vervolgens kunt u velden van dat type maken. Voorbeeld schemafragment:

<!-- 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 voor aangepast veldtype:

// 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);
    }
}

Maak een aangepast veldtype op basis van beschikbare veldtypen

Laten we wat theoretische kennis opdoen voordat we naar het voorbeeld gaan. Er worden hier drie belangrijke termen gebruikt Analyzers , Tokenizers en Filters . Om een dergelijk aangepast veld te maken, moet u een analysator maken met één tokenizer en een of meer filters. Zoals hier vermeld, kunt u slechts één tokenizer per analysator gebruiken, maar er zijn manieren om deze beperking te overwinnen.

<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>

Een ander voorbeeld:

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

Nog een voorbeeld met beschrijving:

<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>

Dit voorbeeld begint met de standaardtokenizer van Solr, die de tekst van het veld in tokens opsplitst. Die tokens passeren vervolgens het standaardfilter van Solr, dat punten uit acroniemen verwijdert en een paar andere veel voorkomende bewerkingen uitvoert. Alle tokens worden vervolgens ingesteld op kleine letters, waardoor het hoofdlettergevoelig zoeken op het tijdstip van de zoekopdracht wordt vergemakkelijkt. Het laatste filter in het bovenstaande voorbeeld is een stammerfilter dat het Porter-algoritme gebruikt. Een stemmer is in feite een set toewijzingsregels die de verschillende vormen van een woord terug toewijst aan de basis, of stam, het woord waaruit ze zijn afgeleid. In het Engels zijn bijvoorbeeld de woorden "knuffels", "knuffelen" en "knuffelen" allemaal vormen van het stamwoord "knuffel". De stemmer zal al deze termen vervangen door "knuffel", wat wordt geïndexeerd. Dit betekent dat een zoekopdracht voor "knuffel" overeenkomt met de term "knuffel", maar niet "enorm".

Voorbeeldgebruik van een dergelijk aangepast veld:

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

Lijst met beschikbare tokenizer-typen: lijst met tokenizer-typen

Lijst met beschikbare filtertypen: lijst met filtertypen



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow