solr
Come creare un campo personalizzatoTipo
Ricerca…
Osservazioni
Note sul campo personalizzato basato su classi Java:
Questa è una piccola sezione di un ordinamento personalizzato di grandi dimensioni in Solr usando un campo esterno scritto per ordinare i documenti Solr in base al confronto di campi personalizzato.
Osservazioni sul campo personalizzato creato dai campi Solr esistenti:
Apache ha creato una documentazione dettagliata su questo argomento: Understanding Analyzers, Tokenizers e Filters .
Creare un tipo di campo Solr personalizzato dalla propria classe Java personalizzata
Modifiche allo schema:
Sarà necessario definire un nuovo tipo di campo nel file dello schema solr e quindi creare campi di quel tipo. Esempio di snippet di schema:
<!-- 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>
Classe Java per tipo di campo personalizzato:
// 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);
}
}
Crea un tipo di campo personalizzato dai tipi di campo disponibili
Prendiamo alcune conoscenze teoriche prima di passare all'esempio. Ci sono tre termini importanti usati qui Analizzatori , Tokenizer e Filtri . Per creare questo campo personalizzato dovrai creare un analizzatore con un tokenizer e uno o più filtri. Come accennato qui , puoi avere un solo tokenizer per analizzatore ma ci sono modi per superare questa limitazione.
<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>
Un altro esempio:
<fieldType name="lowercase_text" class="solr.TextField" positionIncrementGap="150">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
Un altro esempio con descrizione:
<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>
Questo esempio inizia con il tokenizer standard di Solr, che spezza il testo del campo in token. Questi token passano quindi attraverso il filtro standard di Solr, che rimuove i punti dagli acronimi ed esegue alcune altre operazioni comuni. Tutti i token vengono quindi impostati in caratteri minuscoli, il che facilita la corrispondenza senza distinzione tra maiuscole e minuscole al momento della query. L'ultimo filtro nell'esempio precedente è un filtro dello stemmer che utilizza l'algoritmo di Porter. Uno stemmer è fondamentalmente un insieme di regole di mappatura che mappano le varie forme di una parola alla base, o radice, parola da cui derivano. Ad esempio, in inglese le parole "hugs", "hugging" e "hugged" sono tutte forme della parola radice "hug". Lo stemmer sostituirà tutti questi termini con "hug", che è ciò che verrà indicizzato. Ciò significa che una query per "abbraccio" corrisponderà al termine "abbracciato", ma non "enorme".
Esempio di utilizzo di tale campo personalizzato:
<field name="keywords" type="text_stem" indexed="true" stored="true" />
Elenco dei tipi di tokenizer disponibili: elenco dei tipi di tokenizer
Elenco dei tipi di filtro disponibili: elenco dei tipi di filtro