Apache Lucene Query遍历所有查询/术语

soat7uwm  于 2022-11-07  发布在  Lucene
关注(0)|答案(2)|浏览(204)

我有一个接口,它强制实现类来定义和实现一个返回org.apache.lucene.search.Query的函数。这些类创建了各种查询,如TermQueryPhraseQuery等。是否有可能获取返回的org.apache.lucene.search.Query,并对它所包含的所有查询和术语进行迭代?
第一个

dba5bblo

dba5bblo1#

因为你不能update the changessetTerms或类似的),甚至不能in this implementationPhraseQuery),也许这工作。
你可以先检索它们,然后循环遍历它们。无论你想做什么修改,更新术语或创建一个新的术语,甚至丢弃那些不需要的术语。
然后,将query赋给一个新构造的对象,并修改了这些项。类似于对**Query**对象的手动 update/set。在示例中,我只是将这些项添加到builder,但也可以包括前面的参数(slop,...)。

default Query toQuery() 
{
    Query query = getQuery();
    Term[] terms= query.getTerms();
    List<Term> modifiedTerms = new ArrayList<>();
    for (Term t : terms)
    {
        /*Your modifications here f.e --> you copy one, create two terms and discard one
         Term toAdd=null;
         toAdd= t.clone();
         ...
         toAdd = new Term((t.field()+"suffix"), t.text());
         ...
         toAdd = new Term("5","6"); 
         ...
         (do nothing-discard)

         if (toAdd!=null)
            modifiedTerms.add(toAdd);*/
    }

    PhraseQuery.Builder builder = new PhraseQuery.Builder();
    for (int i=0;i<modifiedTerms.size();i++)
         builder.add(modifiedTerms.get(i),i);

    query = builder.build();  
    return query;                               
} 
       /* override the reference and assign a new one very similar to s 
         set/update, if those where implemented.                               
          The last query will be erased on the next GC 
          so there's not a big gap here. Also this is most surely 
          a not needed micro-optimization, no worries. */
up9lanfz

up9lanfz2#

方法是使用QueryTermExtractor

WeightedTerm[] terms = QueryTermExtractor.getTerms(query);

for (WeightedTerm term : terms) {
    System.out.println("THE TERM: " + term.getTerm());
}

我遇到的问题是,我找到的所有示例都是在org.apache.lucene.search.Query上调用.getTerms(),但.getTerms()似乎不再在Query基类上实现。
此外,@阿兰建议的构造新Query对象的方法是“修改”已经构造的不可变Query对象上的项的适当方法。

相关问题