Je tente actuellement d'utiliser Lucene pour rechercher des données peuplées dans un index. P>
Je peux faire correspondre des phrases exactes en l'enclîchant entre parenthèses (c'est-à-dire "" documents de traitement "), mais ne peut pas obtenir de Lucene de trouver cette phrase en faisant une sorte de" document de traitement * ". p>
La différence évidente étant la faute à la fin. p>
Je tente actuellement d'utiliser Luke pour voir et rechercher l'index. (Il tombe l'astérisque à la fin de la phrase lors de l'analyse) p>
Ajout des citations autour des données semble être le principal coupable comme la recherche de document * fonctionnera, mais "Document *" ne P>
Toute aide serait grandement appréciée p>
7 Réponses :
Il semble que le QueryParser par défaut ne puisse pas gérer cela. Vous pouvez probablement créer un queryParser personnalisé pour les caractères génériques de phrases. Si votre exemple est représentatif, stemming peut résoudre votre problème. Veuillez lire la documentation de PorterSemFilter pour voir si cela convient. P>
Non seulement le QueryParser ne prend pas seulement en charge les caractères génériques de phrases, PhraseQuery lui-même ne prend en charge que les termes. MultiPHraseQuery s'approche de plus près, Mais comme le dit son résumé, vous devez toujours énumérer l'index de l'index de l'index.Terms pour correspondre à la carte générique. P>
Qu'est-ce que vous cherchez est FUZZYQUERY qui permet de rechercher des résultats avec des mots similaires basés sur Distance Levenshtein A >. Sinon, vous voudrez peut-être aussi envisager d'utiliser Slop of PhraseQuery ( également disponible dans MULTIPHRASEQUERY EM>) Si l'ordre des mots n'est pas significatif. P>
Comment appliquer FUZZYQUERY sur une phrase? Par exemple, correspondant à "Elton John" avec "Alton Jon". J'ai une liste de noms complets et je veux suggérer des noms correspondants avec des différences d'orthographe.
Une autre alternative consiste à utiliser des ngams et plus particulièrement l'Edgengram. http://wiki.apache.org/solr/analyzerstokeSkerstokersOfilters#solr.edgengramFilterFactory p>
Cela créera des index pour ngams ou parties de mots. Les documents, avec une taille de ngam min de 5 et une taille de ngam max de 8, indexaient: Docum Docume Document Documents P>
Il y a un peu de compromis pour la taille et le temps de l'index. L'un des livres SOLR cite comme guide brut: L'indexation prend 10 fois plus longtemps Utilise 5 fois plus d'espace disque Crée 6 fois plus de termes distincts. P>
Cependant, l'Edgengram fera mieux que cela. P>
Vous devez vous assurer que vous ne soumettez pas de caractère générique dans vos questions. Comme vous ne faites pas de recherche générique, vous correspondez à un terme de recherche sur les ngams (parties de mots). P>
Je cherchais également la même chose et ce que j'ai trouvé, la préfixequery donne une combinaison UA de quelque chose comme ce "document de traitement *". Mais la chose est votre champ que vous recherchez devrait être homologuée et stocker en minuscule (la raison de ce que c'est que cela soit renommé Indexier, ne sauvegarder pas vos valeurs de champ en minuscules) pour que cela fonctionne. Il y a du code pour la préfixe qui a fonctionné pour moi: -
List<SearchResult> results = new List<SearchResult>(); Lucene.Net.Store.Directory searchDir = FSDirectory.GetDirectory(this._indexLocation, false); IndexSearcher searcher = new IndexSearcher( searchDir ); Hits hits; BooleanQuery query = new BooleanQuery(); query.Add(new PrefixQuery(new Term(FILE_NAME_KEY, keyWords.ToLower())), BooleanClause.Occur.MUST); hits = searcher.Search(query); this.FillResults(hits, results);
Utilisez un SpanNearquery avec un pont de 0. P>
Malheureusement, il n'y a pas de spanwildcardquery à Lucene.net. Soit vous aurez besoin d'utiliser SPANMULTERMQUERYWRAPPER ou avec peu d'effort, vous pouvez convertir le version Java à c #. P>
Violer cela. Solution possible. Y a-t-il un moyen de faire une recherche de proximité avec des caractères génériques? On dirait que cela pourrait causer un coup majeur sur la performance.