2008-10-11 42 views
15

在ASP.NET中使用Lucene.Net時,我可以想象一個Web請求可以觸發對索引的更新,而另一個Web請求正在執行搜索。 Lucene.Net是否構建了管理併發訪問的能力,還是我必須管理它,以避免「被其他進程使用」錯誤?Lucene.Net管理多個線程訪問相同的索引,一個索引,而另一個正在搜索?

編輯:閱讀文檔和實驗後,這是我認爲我已經瞭解到:有兩個問題,線程安全性和併發性。多線程是「安全的」,因爲你不能對索引做任何壞事。但是,這是安全的,只需要一個對象同時鎖定索引。第二個對象會出現並拋出異常。因此,您不能讓搜索處於打開狀態,並希望另一個線程中的作者能夠更新索引。如果一個線程忙於更新索引,那麼嘗試創建一個搜索器將會失敗。

此外,搜索者會在打開索引時看到它的索引,因此如果您將它們放在索引中並更新索引,則索引不會看到更新。

我希望我的搜索者看到最新的更新。

我的設計和它似乎工作到目前爲止,我的作家和搜索者共享一個鎖,以便他們不會失敗 - 他們只是等待 - 直到當前寫入或搜索完成。

+0

你能解釋一下你是如何實現鎖的?你使用讀寫鎖還是隻使用一個共享鎖? – 2010-02-15 11:24:18

+0

一個共享鎖。我寫了我所做的: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx – 2010-02-15 14:08:43

+0

你在你的問題中說什麼是錯的:「所以,你可以如果一個線程正在忙於更新索引,那麼嘗試創建一個搜索器將會失敗。「不要讓搜索處於打開狀態,並希望另一個線程中的作者能夠更新索引。 正如其他答案中提到的:「索引編寫器或閱讀器可以在搜索進行時編輯lucene索引文件」,反之亦然。 – 2013-10-20 01:10:21

回答

2

與管理對索引的併發寫入操作不存在問題。我有一個更簡單的路徑與SOLR,它將我的大部分差異都抽象出來,因爲它作爲服務器運行。

21

this page

建立索引和搜索,不僅 線程安全的,但過程是安全的。什麼 這意味着:

  • 多個索引搜索可以同時讀取 Lucene索引文件。
  • 索引作家或讀者可以編輯 Lucene索引文件,同時搜索是 正在進行
  • 多個索引作家或 讀者可以嘗試在同一時間內編輯Lucene的 索引文件(這是 該指數作家重要/ reader 被關閉,所以它會釋放 文件鎖定)。但是,查詢解析器 不是線程安全的,因此使用該索引的每個線程 都應該有自己的 查詢解析器。

但該指數作家,是線程安全的 ,這樣你就可以當人們正在尋找它更新索引 。 但是,您必須確保 具有開放索引 搜索者的線程關閉它們並打開新的 ,以獲取新更新的數據。

3

你可能有問題,如果你的索引線程創建一個新的文件,它會導致一些指數段合併,那麼合併後的部分將被刪除,新段將被創建。問題在於,索引搜索器在打開時加載了所有的段,這樣就會在打開時存在這些段的「指針」。現在,如果索引編寫器執行段合併並刪除段,則索引搜索器仍然會認爲段文件存在,並且會失敗,並顯示「文件未找到錯誤」。您真正需要做的是將您的可寫索引與可搜索索引分離,使用SOLR或執行與SOLR類似的索引快照複製。我在Windows上使用.NET和Lucene.NET構建了與SOLR非常相似的系統,並使用NTFS硬鏈接進行高效的快照複製。如果你有興趣,我可以給你更多的信息。

相關問題