2017-06-22 80 views
0

我正在嘗試使用部分匹配來獲取多詞性查詢。根據JavaDocMultiPhraseQuery如何使用Lucene IndexReader查找術語?

一般化版本PhraseQuery的,與在該被視爲一個析取(OR)的相同位置添加超過一個術語的可能性。要使用此類搜索短語「Microsoft應用程序*」,首先創建一個構建器並使用術語「microsoft」(假設爲小寫分析)的MultiPhraseQuery.Builder.add(Term),然後找到所有具有「app」的術語作爲前綴使用LeafReader.terms(字符串),尋求「應用程序」,然後迭代和收集條款,直到不再有該前綴,並最終使用MultiPhraseQuery.Builder.add(Term [])來添加它們。 MultiPhraseQuery.Builder.build()返回完全構建的(和不可變的)MultiPhraseQuery。

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

我與在那裏說的部分掙扎:

...找到具有 「應用程序」 作爲前綴使用LeafReader.terms(字符串)的所有條款,尋求到「應用程序」,然後迭代和收集條款,直到不再有那個前綴...

如何尋找那裏的條款? LeafReader.terms(String)給你Terms其中有一個iterator方法,給你TermsEnum你可以seek與。我只是不確定如何使用它提取匹配的術語?

回答

1

聽起來就像你掌握如何獲得TermsEnum一樣,所以從這裏開始尋找你想要匹配的前綴,使用seekCeil,然後遍歷TermsEnum,直到遇到一個不符合字首。例如:

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