【问题标题】:How to seek to a term using a Lucene IndexReader?如何使用 Lucene IndexReader 查找术语?
【发布时间】:2017-06-22 15:24:58
【问题描述】:

我正在尝试通过部分匹配获取多短语查询。根据JavaDocMultiPhraseQuery

PhraseQuery 的通用版本,可以在同一位置添加多个术语,这些术语被视为析取 (OR)。要使用此类搜索短语“Microsoft app*”,首先创建一个 Builder 并在术语“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。我只是不确定如何使用它来提取匹配项?

【问题讨论】:

    标签: java search lucene 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多