2011-10-08 6 views
7

J'essaie de chercher un mot partiel en utilisant Solr, mais je n'arrive pas à le faire fonctionner. Je l'utilise dans mon fichier schema.xml.Rechercher des mots partiels en utilisant Solr

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
     <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="1" splitOnNumerics="1" splitOnCaseChange="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/> 
    </analyzer> 
</fieldType> 

Recherche de die h ne fonctionnera pas, mais die hard renvoie des résultats. J'ai réindexé la base de données après l'ajout de la configuration ci-dessus.

Here est l'URL et la sortie lors de la recherche de die hard. Le débogueur est activé.

Here est l'URL et la sortie lors de la recherche de die h. Le débogueur est activé. Je utilise Solr 3.3. Here est le reste du fichier schema.xml.

+0

J'ai résolu ceci. aller à: http://stackoverflow.com/questions/4824954/solr-partial-and-full-string-match/8247013#8247013 – wormhit

Répondre

6

La requête que vous avez partagée recherche dans le champ "title_text", mais le schéma que vous avez posté ci-dessus définit le champ "text". En supposant que c'était juste un oubli, et le champ title_text est défini comme dans votre publication, je pense qu'un problème probable est que NGramTokenizer est configuré avec minGramSize = "3", et vous vous attendez à correspondre en utilisant un jeton d'un seul caractère.

Vous pourriez essayer de changer minGramSize à 1, mais cela conduira inévitablement à des index très inefficaces; et je me demande si vous avez vraiment envie d'avoir "e" correspondre à chaque film avec un e dans le titre?

+0

Est-il possible de définir un 'NGramTokenizerFactory' pour tous les index, pas seulement pour' texte'? J'ai essayé de chercher le film 'The Dancing Masters' en utilisant' Danci', qui a fonctionné. Mais cela n'a pas fonctionné pour chercher 'Danc', aucune idée pourquoi? La limite 'NGramTokenizerFactory' ne devrait-elle pas être fixée à 3? – Oleander

+0

Les analyses (tokenizers, etc.) sont définies par champ dans Solr. Si vous voulez indexer tout le texte de tous vos champs à la fois, vous pouvez définir un copyField qui le fait automatiquement. Je soupçonne que le match "Danci" est dû à une tokenisation et non à NGram. Si vous vous trompez dans l'outil d'administration où vous pouvez voir les résultats de l'analyse, vous devriez pouvoir le dire. –

+0

L'utilisation de copyField a bien fonctionné. [Ici] (https://gist.github.com/1272526) est le résultat. Est-ce que vous connaissez par hasard d'autres filtres de dieux que je pourrais inclure dans mon fichier schema.xml? – Oleander

Questions connexes