使用lucene 5.2.1,我有一个BooleanQuery,它将几个术语查询组合在一起。使用' new'重新创建BooleanQuery和所有子术语查询。每次我需要运行查询时运算符。我想避免打电话给新的'并重新创建这么多的查询对象。是否可以仅更新术语查询中的术语,而无需每次都重新创建布尔或术语查询对象?
答案 0 :(得分:1)
没有。查询构造起来很便宜,并且不适合重用。
在某种程度上可以重用BooleanQuery:
BooleanClause firstClause = boolQuery.clauses.get(0);
//change the first clause to use a different query.
firstClause.setQuery(myNewSubquery);
//Set the BooleanClause.Occur, if you wish
firstClause.setOccur(BooleanClause.Occur.MUST);
当然,您可以像往常一样添加新的子查询,但无法删除子查询。
无法重用TermQuery
。您可以获取基础Term
,但无法修改它。类似的故事大多数查询。有些人,你可以找出修改的方法,如果你看得够近,大多数你不能。
但是,构建查询不应该是一项昂贵的操作。我有理由相信,即使您可以有效地重用查询,它也不会对性能产生明显的影响。运行查询是昂贵的部分,而不是构建它。无论如何,运行查询的第一部分是重写它,这无论如何都要创建一堆新的查询,所以即使你可以自己躲避构建,Lucene仍然会在引擎盖下进行。
如果您遇到实际的性能问题,我会建议进行性能分析以获取有关其实际原因的更多信息。如果不这样做,请don't worry about it。