如何使用Lucene IndexReader寻找术语?

时间:2017-06-22 15:24:58

标签: java search lucene seek

我试图通过部分匹配来获得多语法查询。根据{{​​1}}的{​​{1}}:

  

PhraseQuery的通用版本,可以在同一位置添加多个术语,将其视为析取(OR)。要使用此类搜索短语" Microsoft app *"首先创建一个Builder并在术语" microsoft"上使用MultiPhraseQuery.Builder.add(Term)。 (假设小写分析),然后查找所有包含" app"使用LeafReader.terms(String)作为前缀,寻求" app"然后迭代并收集术语,直到不再有该前缀,最后使用MultiPhraseQuery.Builder.add(Term [])添加它们。 MultiPhraseQuery.Builder.build()返回完全构造的(和不可变的)MultiPhraseQuery。

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

我在与其所说的部分挣扎:

  

...查找所有包含" app"使用LeafReader.terms(String)作为前缀,寻求" app"然后迭代并收集术语,直到不再有该前缀......

如何在那里寻求条款? JavaDoc为您MultiPhraseQuery提供LeafReader.terms(String)方法,为您Terms提供iterator。我不确定如何使用提取匹配术语?

1 个答案:

答案 0 :(得分:1)

听起来你已经掌握了如何获得TermsEnum,所以从那里,只需要使用seekCeil寻找你想要匹配的前缀,然后遍历TermsEnum,直到找到一个没有&#的人。 39; t匹配前缀。例如:

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