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 p>
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". P>
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 .... p> en bref, je voudrais Comme pour obtenir cela fonctionne comme une clause comme une clause similaire à p> puis-je faire cela avec Lucene? P> P>
3 Réponses :
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). P>
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. p>
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). p>
Désactivez profondément dans la compréhension de Lucene. c'est de bonnes choses. : -) p>
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. p>
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. P>
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?
Essayez cette requête:
parser.Parse(query.Keywords.ToLower() + "*")
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!