Recherche…


Remarques

Remarques sur le champ basé sur une classe Java personnalisée:

Ceci est une petite partie d'un tri personnalisé dans Solr en utilisant un champ externe écrit pour trier les documents Solr sur la base d'un comparateur de champ personnalisé.

Remarques sur le champ personnalisé créé à partir des champs Solr existants:

Apache a créé une documentation détaillée sur ce sujet - Comprendre les analyseurs, les jetons et les filtres .

Créez un type de champ Solr personnalisé à partir de votre propre classe Java personnalisée

Modifications du schéma:

Vous devrez définir un nouveau type de champ dans votre fichier de schéma solr, puis créer des champs de ce type. Exemple d'extrait de schéma:

<!-- 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 pour le type de champ personnalisé:

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

Créer un type de champ personnalisé à partir des types de champ disponibles

Prenons quelques connaissances théoriques avant de passer à l'exemple. Trois termes importants sont utilisés ici: Analyseurs , Tokenizers et Filtres . Pour créer un tel champ personnalisé, vous devez créer un analyseur avec un tokenizer et un ou plusieurs filtres. Comme mentionné ci- dessus, vous ne pouvez avoir qu’un tokenizer par analyseur, mais il existe des moyens de surmonter cette limitation.

<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 autre exemple:

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

Un autre exemple avec description:

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

Cet exemple commence avec le tokenizer standard de Solr, qui divise le texte du champ en jetons. Ces jetons passent ensuite par le filtre standard de Solr, qui supprime les points des acronymes et effectue quelques autres opérations courantes. Tous les jetons sont alors définis en minuscules, ce qui facilitera la correspondance insensible à la casse au moment de la requête. Le dernier filtre dans l'exemple ci-dessus est un filtre stemmer qui utilise l'algorithme Porter stemming. Un stemmer est fondamentalement un ensemble de règles de cartographie qui associe les différentes formes d'un mot à la base, ou tige, mot dont elles dérivent. Par exemple, en anglais, les mots "hugs", "hugging" et "hugged" sont toutes des formes du mot-clé "hug". Le stemmer remplacera tous ces termes par "hug", qui sera indexé. Cela signifie qu'une requête pour "hug" correspondra au terme "hugged", mais pas "énorme".

Exemple d'utilisation d'un tel champ personnalisé:

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

Liste des types de tokenizer disponibles: liste des types de tokenizer

Liste des types de filtres disponibles: liste des types de filtres



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow