2009-07-06 19 views
10

Ich versuche derzeit, Lucene zu verwenden, um in einem Index aufgefüllte Daten zu suchen.Lucene - Wildcards in Sätzen

Ich kann auf genaue Phrasen durch Einschließen in Klammern (d. H. "Verarbeitung von Dokumenten"), aber kann nicht Lucene, um diese Phrase zu finden, indem Sie irgendeine Art von "Processing Document *".

Der offensichtliche Unterschied ist der Platzhalter am Ende.

Ich versuche derzeit, Luke zu verwenden, um den Index anzuzeigen und zu suchen. (Es fällt das Sternchen am Ende des Satzes beim Parsen)

die Anführungszeichen Hinzufügen um die Daten, die die Hauptschuld als die Suche nach Dokument zu sein scheinen, wird * arbeiten, aber „Dokument *“ nicht

Beliebig Hilfe würde sehr geschätzt

+0

Fummeln mit diesem. Mögliche Problemumgehung. Gibt es eine Möglichkeit, eine Umgebungssuche mit Platzhaltern durchzuführen? Scheint so, als ob dies einen großen Leistungseinbruch verursachen könnte. –

Antwort

0

Der QueryParser unterstützt nicht nur Platzhalter in Phrasen, PhraseQuery selbst unterstützt nur Terms. MultiPhraseQuery kommt näher, aber wie die Zusammenfassung sagt, müssen Sie noch den IndexReader.terms selbst auflisten, um den Platzhalter zu entsprechen.

0

Es scheint, dass der Standard-QueryParser dies nicht verarbeiten kann. Sie können wahrscheinlich einen benutzerdefinierten QueryParser für Platzhalter in Phrasen erstellen. Wenn Ihr Beispiel repräsentativ ist, kann stemming Ihr Problem lösen. Bitte lesen Sie die Dokumentation für PorterStemFilter, um zu sehen, ob es passt.

0

Eine andere Alternative ist die Verwendung von NGrams und speziell des EdgeNGram. http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

Dies wird Indizes für Ngrams oder Teile von Wörtern erstellen. Dokumente, mit einer min ngram Größe von 5 und max ngram Größe von 8, würde Index: Docum Docume Dokument Dokumente

Es ist ein bisschen ein Kompromiss für Indexgröße und Zeit. Eines der Solr-Bücher zitiert als grobe Anleitung: Indizierung dauert 10 mal länger Verwendet 5 mal mehr Speicherplatz Erzeugt 6-mal mehr unterschiedliche Begriffe.

Allerdings wird das EdgeNGram besser als das tun.

Sie müssen sicherstellen, dass Sie in Ihren Abfragen kein Platzhalterzeichen eingeben. Da Sie keine Platzhaltersuche durchführen, stimmen Sie einen Suchbegriff auf Ngrams (Teile von Wörtern) ab.

0

Ich war auch auf der Suche nach der gleichen Sache und was ich fand ist PrefixQuery gibt ua Kombination von etwas wie diese "Processing Document *". Aber die Sache ist Ihr Feld, das Sie suchen, sollte unokumentiert sein und speichern Sie es Kleinbuchstaben (Grund dafür, da es nicht erkannt wird Indexer wird nicht speichern Ihre Feldwerte in Kleinbuchstaben), damit dies funktioniert.Hier ist der Code für PrefixQuery, die für mich gearbeitet: -

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);