2010-08-24 25 views
3

假設我有一個lucene查詢'id1或id2或id3 ... idN'。隨着N的增加,這種規模如何?lucene查詢大小 - 這是否規模?查詢'1或2或3 ..或N'

我所看到的情況與在購物車中對產品進行文本搜索的人相似,但他們可能擁有成百上千的商品。用戶想要在購物車中的所有產品上進行文本搜索。我可以針對所有可用產品進行文本查詢,然後限制購物車中產品ID的OR子句返回的項目嗎?

回答

4

默認情況下,布爾查詢中的最大子句數爲1024。你可以增加這個限制。雖然會有性能損失。我想,如果你使用過濾器,它會很有效率。

+0

謝謝。我正在學習Lucene,並注意到過濾器也可能解決這個問題,我需要研究這一點。您是指在標記化過程中應用的過濾器,還是其他類型的過濾器?你能描述性能差異嗎(爲什麼這種方法更高性能)? – 2010-08-24 18:09:07

+0

我指的是@Cai Chan在下一個答案中指出的TermsFilter。 – 2010-08-25 16:42:30

0

查詢中布爾語句的數量有限制。

1

由於@Shashikant Kore提到默認限制爲1024。

如果你有一個非常大的文本集合,你可能想看看MoreLikeThis的實現 - 它使用一些簡潔的啓發式方法從你擁有的內容中產生一個有代表性的查詢。

1

在搜索時間內使用FilteredQuery。它的構造函數接受一個查詢和一個過濾器。根據用戶輸入的內容創建查詢(查看QueryParser)。從產品ID列表中創建過濾器(看看TermsFilter)。

2

正如有些人已經回答,有實際的限制。然而,如果你對這個理論感興趣,做一堆或術語與單個術語之間確實沒有什麼區別,並且有很多可能的結果。如果p是與您的查詢相匹配的發佈數(期限/文檔對),並且您想查找k個最佳匹配項,則查詢將在O(p log k)中運行。請參閱Doug的論文Space Optimizations for Total Ranking

如果您的索引總數中包含q個查詢詞OR'd,它實際上就是O(q log t + p log k),但對於大多數應用程序,p log k將主導。 (這個公式來自於找到發佈流需要花費時間的事實,並且您必須針對每個查詢詞做一次。)

+0

太好了,謝謝。 – 2010-08-26 02:20:42