我试图通过部分匹配来获得多语法查询。根据{{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
。我不确定如何使用提取匹配术语?
答案 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);