Lucene - Wildcards in Phrasen
Ich bin derzeit versucht, Lucene zum suchen von Daten aufgefüllt, die in einem index.
Kann ich das Spiel auf exakte Sätze durch eine einklammerung in eckige Klammern (also "Dokumente Verarbeiten"), kann aber nicht bekommen Lucene zu finden, einen Ausdruck, indem Sie tun, jede Art von "Verarbeitung Dokument*".
Dem offensichtlichen Unterschied, dass die Platzhalter am Ende.
Ich bin derzeit versucht, Luke zu öffnen und durchsuchen Sie den index. (es fällt das Sternchen am Ende der phrase, die beim Parsen)
Hinzufügen der Anführungszeichen um die Daten zu sein scheint, die Hauptschuld wie die Suche nach einem Dokument* funktionieren wird, aber "Dokument*" nicht
Jegliche Hilfe würde sehr geschätzt werden
- Das hantieren mit diesem. Möglicher workaround. Gibt es einen Weg, um eine proximity-Suche mit wildcards? Scheint, wie dies könnte zu einem großen hit auf Leistung obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht nur, dass der QueryParser keine Unterstützung von wildcards in Phrasen, PhraseQuery selbst unterstützt nur Begriffe. MultiPhraseQuery kommt näher, aber als seine Zusammenfassung sagt, müssen Sie noch auflisten der IndexReader.Bedingungen sich entsprechend die Platzhalter.
Lucene 2.9 hat ComplexPhraseQueryParser, die mit wildcards in Phrasen.
Was du suchst ist FuzzyQuery, die es einem ermöglicht die Suche nach Ergebnissen mit ähnlichen Wörtern, basierend auf Die Levenshtein-Distanz. Alternativ können Sie auch wollen, erwägen Sie die Verwendung slop von PhraseQuery (auch in MultiPhraseQuery), wenn die Reihenfolge der Wörter ist nicht von Bedeutung.
Scheint es, dass die Standard-QueryParser nicht damit umgehen. Können Sie wahrscheinlich erstellen Sie eine benutzerdefinierte QueryParser für wildcards in Phrasen. Wenn dein Beispiel repräsentativ ist, Wortstamm kann Ihr problem lösen. Bitte Lesen Sie die Dokumentation für PorterStemFilter, um zu sehen, ob es passt.
Andere alternative ist die Verwendung von NGrams und speziell die EdgeNGram. http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory
Dadurch wird das anlegen von Indizes für ngrams oder Teile von Wörtern.
Dokumente, die mit einer min-ngram-Größe von 5 und max ngram Größe von 8, wäre der index:
Docum
Sdie
Dokument
Dokumente
Es ist ein bisschen wie ein Kompromiss für die Indexgröße und die Zeit.
Einer der Solr-Bücher-Zitate als eine grobe Anleitung:
Die Indizierung dauert 10 mal länger
Verwendet 5 mal mehr Speicherplatz
Erstellt von 6-mal mehr unterschiedliche Ausdrücke.
Jedoch die EdgeNGram besser machen wird als das.
Sie tun müssen, um sicherzustellen, dass Sie nicht Einreichen Platzhalterzeichen in Abfragen.
Als Sie nicht tun, eine wildcard-Suche, Sie sind passend zu einem Suchbegriff auf ngrams(Teile von Wörtern).
Ich war auch auf der Suche für die gleiche Sache, und was ich gefunden habe ist PrefixQuery gibt u a Kombination von einige Sache wie diese "Verarbeitung Dokument*".Aber die Sache ist Ihr Feld, das Sie suchen, für die nicht geteilte und speichern Sie es in Kleinbuchstaben (Grund so, da es nicht in einzelne Tokens aufgeteilte indexer nicht speichern Sie Ihre Feld-Werte in Kleinbuchstaben) für diese zu arbeiten.Hier ist der code für PrefixQuery, die für mich gearbeitet :-
Verwenden SpanNearQuery mit einer slop von 0.
Leider gibt es keine SpanWildcardQuery in Lucene.Net. Entweder müssen Sie verwenden SpanMultiTermQueryWrapper, oder mit wenig Aufwand können Sie konvertieren die java-version C#.