9
votes

Comment faire des recherches partielles de mots à Lucene.net?

J'ai un indice relativement petit contenant environ 4 000 emplacements. Entre autres choses, je l'utilise pour peupler un champ autocomplete sur un formulaire de recherche.

Mon index contient des documents avec un champ de localisation contenant des valeurs telles que

  • ohio
  • Dayton, Ohio
  • Dublin, Ohio
  • Columbus, Ohio

    Je veux pouvoir taper "Ohi" et que tous ces résultats apparaissent et que tout ce que rien ne se présente jusqu'à ce que je tape le mot complet "Ohio".

    I ' m en utilisant lucene.net v2.3.2.1 et la partie pertinente de mon code est la suivante pour la configuration de ma requête .... xxx

    en bref, je voudrais Comme pour obtenir cela fonctionne comme une clause comme une clause similaire à xxx

    puis-je faire cela avec Lucene?


0 commentaires

3 Réponses :


0
votes

Il s'agit davantage de remplir votre index avec des mots partiels en premier lieu. Votre analyseur doit mettre dans les mots-clés partiels dans l'index en analyses (et vous les pondre, puis les plus bas que les mots-clés complets tels que cela).

Les arbres de recherche de Lucene Index travaillent de gauche à droite. Si vous souhaitez effectuer une recherche au milieu d'un mot clé, vous l'avez romptu comme vous analysez. Le problème est que les mots-clés partiels exploseront habituellement vos tailles d'index.

Les gens utilisent généralement des analyseurs vraiment créatifs qui rompent les mots en mots racines (qui décollent des préfixes et des suffixes).

Désactivez profondément dans la compréhension de Lucene. c'est de bonnes choses. : -)


0 commentaires

1
votes

Oui, cela peut être fait. Mais, la principale base générale peut entraîner des requêtes lentes. Vérifiez le Documentation . De plus, si vous indexez la chaîne entière (par exemple, «Dayton, Ohio») en tant que jeton unique, la plupart des requêtes dégénéreront pour diriger des requêtes de préfixes. À l'aide d'un tokéniseur comme Standardanalyzer (que je suppose que vous le faites déjà) entraînera la nécessité de diriger des caractères génériques.

Si vous ne voulez pas de préfixes de premier plan pour des raisons de performance, vous pouvez essayer d'indexer des ngams. De cette façon, il n'y aura aucune requête générique principale. Le ngram (en supposant que seulement de la longueur 4) Tokenizer créera des jetons pour "Dayton Ohio" comme "Dayt", "Ayto", "Yton" et ainsi de suite.


1 commentaires

Merci pour la réponse. Je ne suis pas trop inquiet pour les requêtes lentes encore que j'aimerais voir cela fonctionner d'abord avant de décider si c'est trop lent ou non. Ma liste de localisation devrait rester stable à environ 4 000 documents, donc je ne suis pas trop inquiet pour que cela soit plus grand. Quand vous dites: "Oui, cela peut être fait." Pourriez-vous élaborer un peu plus? Je pensais que le code que j'ai affiché ci-dessus devrait faire ce que je m'attends, mais ce n'est pas le cas. Des idées sur ce que je fais mal?



13
votes

Essayez cette requête:

parser.Parse(query.Keywords.ToLower() + "*")


3 commentaires

Cette réponse ne reflète pas ce que le code final devrait ressembler. Je suis une perte sur où mettre ça? Quel type est "Query"? Un exemple final serait génial.


En Java au moins, vous devriez couper des espaces, car la requête "Test *" compilera tout en "test *"


@thinkzig: Je sais que c'est une question ancienne, mais pourriez-vous modifier cette réponse pour montrer comment le code final ressemble (où cette ligne devrait-elle être ajoutée)? Merci!