2009-06-13 74 views
5

我正在研究一個項目,我將擁有大量數據,並且可以通過幾種非常高效地表達爲SQL查詢的形式進行搜索,但它也需要通過自然語言處理進行搜索。結合Lucene.NET和關係數據庫的最佳實踐?

我的計劃是建立一個索引使用Lucene的這種形式的搜索。

我的問題是,如果我這樣做,並執行搜索,Lucene將返回索引中匹配文檔的ID,然後我必須從關係數據庫中查找這些實體。

這可以通過兩種方式來完成(即我能想到的至今):

  • 施氮量查詢(可怕的)
  • 通過所有的ID的存儲過程一次(也許是因爲逗號分隔參數)。這具有被限制爲最大參數大小的缺點,以及UDF將字符串拆分爲臨時表的性能低下。

我幾乎試圖將所有內容都映射到lucenes索引,以便我可以定期從後備存儲生成索引,但只需要訪問前端的索引。

建議?

+0

嗨。你完成了你的項目嗎?你做了什麼? – Eduardo 2011-06-01 02:14:50

回答

2

當我遇到這個問題時,我使用了具有全文搜索功能的關係數據庫(我使用了PostgreSQL 8.3,它內置了ft支持,支持詞幹和同義詞庫)。這樣數據庫可以使用SQL和ft命令進行查詢。缺點是你需要一個具有全文搜索功能的數據庫,這些功能可能比lucene的功能差。

4

我會將「前端」數據存儲在索引本身內,避免任何數據庫交互。只有當您需要有關特定記錄的更多信息時纔會查詢數據庫。

1

我想答案取決於你將如何處理結果,如果你要在網格中顯示結果並讓用戶選擇他想訪問的確切文檔,那麼你可能想要添加到索引足夠的文本可以幫助用戶識別文檔,就像說200個字符的blurb,然後一旦成員選擇一個文檔打到DB來檢索整個事情。

這肯定會影響索引的大小,所以這是您需要牢記的另一個考慮因素。我還會在數據庫和前端之間放置一個緩存,以便最常用的項目不會每次都花費數據庫訪問的全部成本。

+0

我覺得Lucene DOES有內存中的緩存。沒有? – 2013-03-01 19:15:55

0

可能不是一個選項,取決於您的數據庫中有多少東西,但我所做的是將數據庫ID存儲在搜索索引中以及我想索引的屬性。然後,在我的服務類中,我緩存顯示所有對象的搜索結果所需的所有數據(例如,名稱,數據庫標識,圖像URL,描述模糊,社交媒體信息)。服務類返回一個可以通過db id查找對象的Dictionary,並且使用Lucene.NET返回的id從內存中緩存中獲取數據。

您也可以放棄內存中緩存並存儲在搜索索引中顯示搜索結果的所有必要屬性。我沒有這樣做,因爲內存緩存也用於搜索以外的場景。

內存中的緩存在幾個小時內總是新鮮的,並且唯一的時間是我需要爲單個對象提取更詳細的數據(如果用戶點擊了鏈接一個特定的對象去該對象的頁面)。