因为你不能update the changes(setTerms或类似的),甚至不能in this implementation(PhraseQuery),也许这工作。 你可以先检索它们,然后循环遍历它们。无论你想做什么修改,更新术语或创建一个新的术语,甚至丢弃那些不需要的术语。 然后,将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. */
2条答案
按热度按时间dba5bblo1#
因为你不能update the changes(
setTerms
或类似的),甚至不能in this implementation(PhraseQuery
),也许这工作。你可以先检索它们,然后循环遍历它们。无论你想做什么修改,更新术语或创建一个新的术语,甚至丢弃那些不需要的术语。
然后,将
query
赋给一个新构造的对象,并修改了这些项。类似于对**Query
**对象的手动 update/set。在示例中,我只是将这些项添加到builder
,但也可以包括前面的参数(slop
,...)。up9lanfz2#
方法是使用
QueryTermExtractor
。我遇到的问题是,我找到的所有示例都是在
org.apache.lucene.search.Query
上调用.getTerms()
,但.getTerms()
似乎不再在Query
基类上实现。此外,@阿兰建议的构造新
Query
对象的方法是“修改”已经构造的不可变Query
对象上的项的适当方法。