2009-09-13 77 views
2

我有一個典型的企業/商業應用程序,包括訂單,銷售人員,聯繫人,參考數據等......系統中至少有100個或更多的用戶輸入新數據,改變數據等等。我需要爲整個應用程序提供幾乎所有表的搜索功能。我可以使用Lucene進行商業應用程序搜索嗎?

一種選擇是進行表格查詢,如「select * from salespersons where name contains'searchtest'」或類似的東西。但我想知道如果我可以用Lucene(.net)代替它。

最重要的是,搜索需要在幾秒鐘內反映變化。因此,例如,如果用戶輸入訂單,然後立即立即搜索,則需要顯示在搜索列表中。 (即,我不能每小時或半小時或每晚都有索引工作)。

這是可以正常工作的,還是有更好的選擇?

回答

2

我已經實現的東西幾乎等同於你的描述。要索引的表是巨大的(用lucene索引需要5個小時以上),並且要求搜索將在5分鐘內反映DB中的變化。還有我認爲這兩種方法(我實現了第一個):

  • 索引的表遞增。每行都有一個時間戳(最後修改)。每5分鐘一個cron作業就會啓動一個java進程,讀取自上次運行後修改的行,創建它們的純文本版本,然後更新lucene索引。增量索引 將鎖定大約1000個錶行的200-300 ms。顯然這取決於你的系統,數據庫模式等。但我的經驗是,這是絕對實用的。而lucene的搜索操作比查詢快幾個數量級。

  • 使用專用線程進行索引。只要DB中的某些內容發生變化,實際運行SQL查詢的代碼就應該發送一條消息(通過LinkedBlockinQueue)到更新lucene索引的線程。這樣,主線程的updateDB()方法在數據庫更新後立即返回,不必等待lucene索引過程,而索引儘快發生(通常稍後幾個msecs)。其中一個缺點是lucene使用存儲在磁盤中的鎖。所以我假設每更新一行索引都會有開銷(我還沒有運行任何基準測試)。解決方法是在索引線程上保留更新緩衝區,並每隔幾秒將其刷新到磁盤(同樣,性能取決於更新與索引搜索的比率)

4

是的,你肯定可以在這個用例中使用Lucene。我看到一些缺點:(你就會有實現的東西保持同步指標和數據庫,這可能不是簡單)

  • 你會被複制多的信息索引
  • 你會經常碰到數據庫(或者延遲插入或者只是創建更多的負載,這取決於你選擇構建它的方式)來構建這個索引。
  • 近實時搜索僅在latest version of official Lucene中執行。我不知道Lucene.net在這方面的狀態。

和A(大)上行:

  • 的Lucene將在性能和質量的結果最有可能跑贏數據庫全文索引。

對這個問題的答案可能幫助Lucene.Net Best Practices

相關問題