2010-10-19 35 views
0

我們有一個SQL Server數據庫,其中有百萬條記錄,索引爲Lucene.netNhibernate.Search。當我們爲我們的課程建立索引時,我們試圖擴大範圍,因爲索引/檢索的成本非常小。目標是在分頁的網頁上向用戶提供全文搜索。Lucene.Net和Nhibernate.Search:如何管理複雜的搜索?

由於SQL Server會在發送過多參數(默認情況下爲2100個參數)時發出抱怨,並且由於我們不希望每次都改變該參數,因此我們達到了極限(這很容易發生,文檔中的某些術語是非常普遍但必須可搜索)我們決定處理從排序到分頁的所有內容,在Lucene中。它像一個魅力。

但是,最近,功能蠕變導致我們一些問題,因爲新的查詢不僅需要訪問未被索引的字段,而且還需要訪問不應被訪問或不能被訪問的字段:計算字段,推薦列表等 ...

因爲我們已經把所有的分頁和排序都放到了Lucene.Net中,並且由於SQL Server對它的參數有挑剔,我們怎麼能設法讓我們的蛋糕吃掉呢?

我正在研究如何首先執行sql查詢計算,將元素減少到他們的doc ID,然後向所有可能的id提供一個巨大的OR查詢,讓它選擇正確的可能,但我擔心查詢大小

僞代碼

​​

顯然,這是可能有Lucene的過濾由只允許某些文件ID是查詢的一部分,所以它應該是可能的工作,但我真的不請參閱Nhibernate.search中的方法

你有什麼想法我應該如何處理這個問題?是否可以通過詢問SQL ID列表來過濾查詢?這是否過分矯枉過正?那裏有其他解決方案嗎?

回答

1

通常你有問題,當Lucene.Net返回2100多個結果,如NHibernate.Search將建立一個大的SELECT * FROM T WHERE ID IN(@ P0,P1 @ ......)

所以,如果你的lucene查詢不會返回超過2100個結果,你應該沒問題。