2017-06-22 3 views
0

Ich versuche, mit einer teilweisen Übereinstimmung eine mehrsprachige Abfrage zu erhalten. Nach dem JavaDoc für MultiPhraseQuery:Wie suche ich nach einem Begriff mit einem Lucene IndexReader?

Eine verallgemeinerte Version von PhraseQuery, mit der Möglichkeit, mehr als ein Begriff in der gleichen Position des Hinzufügens, der als Disjunktion behandelt werden (OR). Wenn Sie diese Klasse verwenden möchten, um nach dem Ausdruck "Microsoft App *" zu suchen, erstellen Sie zuerst einen Builder und verwenden Sie MultiPhraseQuery.Builder.add (Term) für den Begriff "microsoft" (unter der Annahme von Kleinbuchstaben) und suchen Sie dann alle Begriffe mit "app" Präfix mit LeafReader.terms (String), Suche nach "App" dann Iterieren und Sammeln von Begriffen, bis nicht mehr dieses Präfix, und schließlich verwenden MultiPhraseQuery.Builder.add (Term []), um sie hinzuzufügen. MultiPhraseQuery.Builder.build() gibt das vollständig erstellte (und unveränderbare) MultiPhraseQuery zurück.

https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/search/MultiPhraseQuery.html

Ich bin mit dem Teil zu kämpfen, wo es heißt:

... finden Sie alle Begriffe, die "App" als Präfix LeafReader.terms (String) haben, suchen zu "app" dann iterieren und sammeln Begriffe, bis es nicht mehr das Präfix ...

Wie sucht man dort drüben Begriffe? LeafReader.terms(String) gibt Ihnen Terms, die eine iterator Methode hat, die Sie TermsEnum gibt, die Sie seek mit. Ich bin nur nicht sicher, wie extrahieren übereinstimmende Begriffe das verwenden?

Antwort

1

Klingt wie Sie ein Gespür haben, wie die TermsEnum zu bekommen, also von dort, nur auf die Sie passen seekCeil mit wollen Präfix suchen, und dann durch die TermsEnum laufen, bis Sie auf eine, die nicht dem Muster Präfix. Zum Beispiel:

Terms terms = MultiFields.getTerms(indexReader, "text"); 
TermsEnum termsEnum = terms.iterator(); 
List<Term> matchingTerms = new ArrayList<Term>(); 
termsEnum.seekCeil(new BytesRef("app")); 
while (termsEnum.term().utf8ToString().startsWith("app")) { 
    matchingTerms.add(new Term("text", termsEnum.term())); 
    termsEnum.next(); 
} 
System.out.println(matchingTerms);