2009-08-20 6 views
9

Nous avons une base de données de films et de séries, et comme les données proviennent de nombreuses sources de fiabilité variable, nous aimerions être en mesure de faire correspondre les chaînes floues sur les titres des épisodes. Nous utilisons Solr pour la recherche dans notre application, mais les mécanismes de correspondance par défaut fonctionnent sur les niveaux de mots, ce qui n'est pas assez bon pour les chaînes courtes, comme les titresComment utiliser n-grammes correspondant approximatif avec Solr?

J'ai utilisé des correspondances approximatives n-grammes dans le passé, et j'étais très heureux de constater que Lucene (et Solr) supporte quelque chose hors de la boîte. Malheureusement, je n'ai pas pu le configurer correctement.

Je suppose que je besoin d'un type de champ spécial pour cela, donc j'ai ajouté le suivant type de champ à mon schema.xml:

<fieldType 
    name="trigrams" 
    stored="true" 
    class="solr.StrField"> 
<analyzer type="index"> 
    <tokenizer 
     class="solr.analysis.NGramTokenizerFactory" 
     minGramSize="3" 
     maxGramSize="5" 
     /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

et changé le champ approprié dans le schéma à:

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 

Cependant, cela ne fonctionne pas comme prévu. L'analyse de la requête semble correctement, mais je n'obtiens aucun résultat, ce qui me fait croire que quelque chose se passe au moment de l'index (ie le titre est indexé comme un champ par défaut au lieu du champ trigramme).

La requête que je suis en train est quelque chose comme

title:"guy walks into a psychiatrist office" 

(avec une faute de frappe ou deux) et il doit correspondre à « Guy Walks dans un Psychiatre Office ».

(je ne suis pas vraiment sûr si la requête est correcte.)

De plus, je voudrais pouvoir faire quelque chose de plus en fait. Je voudrais en dessous de la chaîne, supprimer tous les signes de ponctuation et les espaces, supprimer mots d'arrêt anglais et puis changer la chaîne en trigrammes. Cependant, les filtres sont appliqués seulement après que la chaîne a été tokenized ...

Merci d'avance pour vos réponses.

+0

Pouvez-vous poster la requête que vous utilisez? – olle

+0

J'ai modifié la question pour inclure un exemple de requête. –

Répondre

3

La solution s'est avérée très simple: AND a été défini comme l'opérateur par défaut, et si l'un des ngrammes ne correspond pas, la requête entière a échoué. Ainsi, il suffisait d'ajouter:

<solrQueryParser defaultOperator="OR" /> 

dans ma définition de schéma.

+5

Votre réponse donne à penser qu'a posteriori la question n'a rien à voir avec ngrams. Ai-je raison? –

+2

@RyszardSzopa 'OR' n'est pas la même chose que l'analyse n-gram. 'OR' donne beaucoup de résultats mais généralement de très mauvais résultats. –

9

Pour répondre à la dernière partie de votre question: solr a aussi un filtre ngram. Donc, vous ne devriez pas utiliser le tokenizer ngram (mais comme « WhitespaceTokenizer », par exemple), appliquer tous les filtres pré-Ngram puis ajouter celui-ci:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />