2015-09-01 23 views
0

使用lucene 5.2.1,我有一個BooleanQuery,它將幾個術語查詢結合​​在一起。每次需要運行查詢時,都會使用'new'運算符重新創建布爾查詢和所有子查詢。我想避免調用'new'並重新創建如此多的查詢對象。是否有可能只更新術語查詢中的術語而無需每次重新創建布爾或術語查詢對象?可能重複使用具有不同術語的lucene查詢對象嗎?

回答

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

相關問題