2017-05-21 2 views
0

J'essaie de répliquer la fonctionnalité LIKE de SQL dans Lucene.LIKE fonctionnalité pour la phrase dans lucene

Si je recherche en utilisant les jokers, dites "* Tulips Inn Riyadhh *" Je suis face avec le comportement suivant:

  1. Tulips Inn Riyadh - Adéquation
  2. Tulips Inn Riyadhhhss - ne correspond pas à
  3. Tulips Inn Riyadh - HHS correspondants
  4. tulipes - correspondant à
  5. Riyadhh - correspondant à

En fait, j'ai besoin d'un exemple dans Lucene où la condition "2" devrait correspondre et "4" ne devrait pas correspondre.

J'ai essayé avec toutes les requêtes mais le deuxième scénario ne correspond pas.

Certaines personnes ont conseillé d'utiliser le Tokenizer et l'analyseur personnalisé.

Depuis que je suis nouveau à Lucene j'ai travaillé avec des requêtes, mais je ne sais pas comment intégrer Tokenizer et Analyzer personnalisé à nos requêtes.

+0

En ajoutant à votre message la chaîne d'analyse des champs impliqués dans votre recherche, tous les paramètres utilisés dans les requêtes que vous avez essayées et la version de Solr que vous utilisez seraient très utiles. – freedev

Répondre

0

Si vous que voulez préfixe correspondant, vous pouvez utiliser un KeywordTokenizer avec un LowercaseFilter et un EdgeNgramFilter:

<analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/> 
</analyzer> 

Cette chaîne gardera le texte entrant comme un seul jeton (KeywordTokenizer), puis convertir le le texte entrant en minuscules (LowerCaseFilter) avant de le diviser en plusieurs jetons en fonction de la longueur de la chaîne.

Si vous voulez faire correspondre partout dans une chaîne, vous pouvez utiliser une ngramfilter simple:

<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 

.. mais sachez que la taille de votre index augmentera rapidement si la différence entre min et max est grand. Il existe également une deuxième option, qui utilise le filtre ReversedWildcardFilter qui est spécifiquement réglé pour la condition de requête *foo*, donc si vous n'avez pas besoin d'un traitement supplémentaire de chaque jeton (par exemple, en séparant chaque jeton, etc.) Cela pourrait être une option.