[英]How to seek to a term using a Lucene IndexReader?
我正在嘗試使用部分匹配來獲得多短語查詢。 根據MultiPhraseQuery
的JavaDoc
:
PhraseQuery 的通用版本,可以在同一位置添加多個術語,這些術語被視為析取 (OR)。 要使用此類搜索短語“Microsoft app*”,首先創建一個構建器並在術語“microsoft”上使用 MultiPhraseQuery.Builder.add(Term)(假設分析為小寫),然后找到所有具有“app”的術語使用 LeafReader.terms(String) 前綴,尋求“應用程序”,然后迭代和收集術語,直到不再有該前綴,最后使用 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(String) 查找所有以“app”為前綴的術語,尋找“app”,然后迭代和收集術語,直到不再有該前綴...
怎么找那邊的條款? LeafReader.terms(String)
給你Terms
它有一個iterator
,讓你的方法TermsEnum
,你可以seek
用。 我只是不確定如何使用它提取匹配的術語?
聽起來您已經掌握了如何獲取 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);
我有完全相同的問題(的確如此,其他人也有)。 如果您找到了可行的解決方案,那么您是否可以顯示完整的代碼[包含必需的#includes],因為我正在努力解決所有這些問題。 示例越可行,就越容易適應Lucene的搜索功能。 我通常使用Groovy進行測試,因為創建和運行示例代碼是如此之快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.