web-dev-qa-db-fra.com

Recherche insensible à la casse SOLR

J'ai un problème avec SOLR Search.
J'ai des données comme celle-ci:
enter image description here

J'utilise solr admin pour trouver ces données en utilisant une requête comme celle-ci:

address_s:*Nadi*

et a trouvé ces données. Mais quand j'utilise cette requête:

address_s:*nadi*

il n'a rien trouvé.
J'ai googlé et j'ai trouvé une réponse pour créer un champ avec le script suivant:

<fieldType name="c_text" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>

    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

J'ai copié et collé ces scripts dans schema.xml, mais cela ne fonctionne toujours pas. Que devrais-je faire? Quelqu'un peut-il m'aider?

16
Praditha

Le champ address_s doit être défini comme -

<field name="address_s" type="c_text" indexed="true" stored="true"/>

Si vous utilisez le schéma par défaut.xml, cette définition doit précéder -

<dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>

qui le définit comme un type de champ de chaîne sans analyse effectuée.

Les requêtes génériques ne sont pas analysées.
Donc, si vous appliquez un filtre en minuscules à la requête de temps d'index address_s:*nadi* travaillerait.
Cependant, interrogez address_s:*Nadi * ne le serait pas, car Nadi ne correspondra pas à nadi dans l'index et vous devrez réduire les requêtes du côté client.

12
Jayendra

Je l'ai utilisé comme type de champ:

<fieldType name="string" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Et défini mes domaines en utilisant:

<field name="address" type="string" indexed="true" stored="true"/>

Le résultat: Mon document retourne les champs dans la casse droite (comme inséré) et je peux faire une recherche insensible à la casse (en utilisant des lettres majuscules et minuscules) ...

Version: Solr 3.6

7
Jeff Maes

Votre champ address_s utilise-t-il c_text type de champ dans votre schema.xml?

Si votre index a été créé avec la configuration précédente, vous devez tout réindexer pour prendre en compte les modifications.

5
jpountz

J'ai utilisé quelque chose comme ça ... Dans schema.xml j'ai mis un nouveau fieldType

<fieldType name="newType" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory" />
      </analyzer>
 </fieldType>

Affectez le nouveau type au champ que vous souhaitez rendre insensible à la casse et aux espaces. Ensuite, vous devez construire la requête solr sous la forme: fieldName:(*fieldValue\ *)

1
Manos

au lieu de type="string" définir le champ type="text_general" (tel que défini dans le schéma par défaut.xml). Sur eof sa propriété est ignore case=true

1
Shimon Benattar