我們正在爲企業Web應用程序設計搜索體系結構。我們將爲此使用Lucene.net。索引不會很大(大約100,000個文檔),但搜索服務必須始終保持最新狀態。將一直有新的文件添加到索引和併發搜索。 由於我們必須爲搜索系統提供高可用性,因此我們有兩臺應用程序服務器公開WCF服務以執行搜索和索引(服務的副本在每個服務器中運行)。服務器然後使用lucene.net API訪問索引。跨多個應用程序服務器同步Lucene.net索引
問題是,保持索引始終同步的最佳解決方案是什麼?我們已經考慮了幾種選擇:
使用索引和一個服務器 具有第二服務器訪問通過SMB的 指標:沒有做不到的,因爲我們有 失敗 情況的單點;
爲兩臺服務器建立索引,實質上每次編寫索引兩次:可能性很差,並且可能會出現異步。服務器1索引正常,服務器2耗盡磁盤空間或任何東西;
使用SOLR或KATTA來包裝對索引的訪問:nope,我們不能在服務器上運行tomcat或類似服務器,我們只有IIS。我發現這可以通過Lucene(JdbcDirectory模塊)的Java版本來完成,但是我找不到Lucene.net的任何類似的東西。即使這意味着小的性能下降,我們也會選擇這個選項,因爲它可以徹底解決併發問題,並與mininum開發同步。
使用Lucene.net DistributedSearch contrib模塊:我無法用文檔記錄關於此的單個鏈接。我甚至不知道通過查看代碼的代碼是什麼,但在我看來,它實際上將索引拆分到多臺機器上,這不是我們想要的。如果索引變大,可能需要一段時間,並且在這段時間內,我們將會成爲rsync和朋友,在兩臺服務器之間來回拷貝索引:返回腐敗或不一致的數據給客戶,所以我們不得不制定一些我們不想要的特別鎖定策略。
我知道這是一個複雜的問題,但我相信很多人都面對過它。歡迎任何幫助!
肖恩,這是目前我們的候選人選項。我同意你和它的看法,這似乎是最爲抉擇的選擇。我還試圖找到JdbcDirectory的源代碼,以查看.NET + SQL服務器的端口是否可行。 將問題保持開放一段時間,看看是否有新的方法出現,否則將接受此答案。 – 2009-06-03 12:44:45
我查了一次同樣的事情。這似乎不值得付出努力,因爲存在一堆與DB事務相關的東西,這些東西並不是微不足道的。也有使用JDBCDirectory的東西降低速度的抱怨。源文件在Compass項目中 - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ – 2009-06-03 22:39:04