Sök…


Anmärkningar

Kommentarer om anpassat Java-klassbaserat fält:

Detta är en liten sektion av en stor artikelanpassad sortering i Solr med externt fält skrivet för att sortera Solr-dokument baserat på anpassad fältkomparator.

Kommentarer om anpassat fält skapat från befintliga Solr-fält:

Apache har skapat en detaljerad dokumentation om detta ämne - Förstå analysatorer, tokenisatorer och filter .

Skapa en anpassad Solr-fälttyp från egen anpassad Java-klass

Schema ändras:

Du måste definiera en ny fälttyp i din solr-schemafil och sedan kan du skapa fält av den typen. Exempel på schematavsnitt:

<!-- 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-klass för anpassad fälttyp:

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

Skapa anpassad fälttyp från tillgängliga fälttyper

Låt oss få lite teoretisk kunskap innan vi går över till exemplet. Det finns tre viktiga begrepp som används här analysatorer , Tokenizers och filter . För att skapa ett sådant anpassat fält måste du skapa en analysator med en tokenizer och ett eller flera filter. Som nämnts här kan du bara ha en tokenizer per analysator men det finns sätt att övervinna denna begränsning.

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

Ett annat exempel:

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

Ytterligare ett exempel med beskrivning:

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

Detta exempel börjar med Solrs standard tokenizer, som delar fältets text i tokens. Dessa symboler passerar sedan genom Solrs standardfilter, som tar bort prickar från akronymer och utför några andra vanliga operationer. Alla symboler ställs sedan in på små bokstäver, vilket kommer att underlätta en okänslig anpassning av fall vid frågestund. Det sista filtret i exemplet ovan är ett stamfilter som använder Porter-stammalgoritmen. En stammer är i princip en uppsättning kartläggningsregler som kartlägger de olika formerna av ett ord tillbaka till basen, eller stam, ord som de härrör från. Till exempel, på engelska är orden "kramar", "kramar" och "kramade" alla former av stamordet "kram". Stammaren kommer att ersätta alla dessa termer med "kram", vilket är vad som kommer att indexeras. Detta innebär att en fråga om "kram" kommer att matcha termen "kramad", men inte "enorm".

Exempel på användning av sådant anpassat fält:

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

Lista med tillgängliga tokenizertyper: lista över tokenizertyper

Lista över tillgängliga filtertyper: lista över filtertyper



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow