簡體   English   中英

如何使用 Lucene IndexReader 查找術語?

[英]How to seek to a term using a Lucene IndexReader?

我正在嘗試使用部分匹配來獲得多短語查詢。 根據MultiPhraseQueryJavaDoc

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM