J'ai un problème avec SOLR Search.
J'ai des données comme celle-ci:
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?
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.
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
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.
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\ *)
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