2017-06-22 4 views
0

J'essaie d'obtenir une requête multi-phrasée avec une correspondance partielle. Selon le JavaDoc pour MultiPhraseQuery:Comment chercher un terme en utilisant un IndexReader de Lucene?

une version généralisée de PhraseQuery, avec la possibilité d'ajouter plus d'un terme à la même position qui sont traités comme une disjonction (OU). Pour utiliser cette classe pour rechercher l'expression "Microsoft app *" créez d'abord un Builder et utilisez MultiPhraseQuery.Builder.add (Term) sur le terme "microsoft" (en supposant une analyse en minuscules), puis trouvez tous les termes qui ont "app" comme préfixe en utilisant LeafReader.terms (String), en cherchant à "app" puis en itérant et en collectant des termes jusqu'à ce qu'il n'y ait plus ce préfixe, et finalement utilisez MultiPhraseQuery.Builder.add (Term []) pour les ajouter. MultiPhraseQuery.Builder.build() renvoie le MultiPhraseQuery entièrement construit (et immuable).

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

Je me bats avec la partie où il est dit:

... trouver tous les termes qui ont "app" comme préfixe à l'aide LeafReader.terms (String), recherche à "app" puis itération et la collecte des termes jusqu'à ce qu'il n'y a plus ce préfixe ...

Comment cherche-t-on là-bas des termes? LeafReader.terms(String) vous donne Terms qui a une méthode iterator qui vous donne TermsEnum que vous pouvez seek avec. Je ne suis pas sûr de savoir comment extraire les termes correspondants en utilisant cela?

Répondre

1

On dirait que vous avez compris comment obtenir le TermsEnum, donc à partir de là, cherchez simplement le préfixe que vous voulez faire correspondre en utilisant seekCeil, puis passez en revue le TermsEnum jusqu'à ce que vous arriviez à un qui ne correspond pas au préfixe. Par exemple:

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