我使用的Lucene.net 3.0.3和AzureDirectory 2.0.4937.26631我從NuGet(在NuGet中稱爲Lucene.Net.Store.Azure)安裝。如何使AzureDirectory和Lucene.net具有並行IndexWriters?
在azuredirectory.codeplex.com狀態的項目描述「更具體的:你可以有1..1工作者角色添加文檔到索引,和1..1搜索webroles想要搜索的目錄以近乎實時的。」 (強調增加)暗示可能有多個工作者角色並行寫入索引。但是,當我嘗試這樣做時,我得到了許多「鎖定超時:[email protected]」。例外。
我的代碼遵循AzureDirectory文檔(azuredirectory.codeplex.com/documentation)中給出的示例。我的代碼大致(簡化的問題)。
var dbEntities = // Load database entities here
var docFactory = // Create class that builds lucene documents from dbEntities
var account = // get the CloudStorageAccount
var directory = new AzureDirectory(account, "<my container name>");
using(var writer = new IndexWriter(directory, new StandardAnalyzer(Version.LUCENE_30), createEvenIfExists, IndexWriter.MaxFieldLength.UNLIMITED))
{
foreach(var entity in entities)
{
writer.AddDocument(docFactory.CreateDocument(entity));
}
}
當按順序運行時,此代碼正常工作。但是,如果我在多個線程/工作者上並行運行相同的代碼。我得到很多「鎖定超時:[email protected]。」例外:
[Lucene.Net.Store.LockObtainFailedException: Lock obtain timed out: [email protected]]
at Lucene.Net.Store.Lock.Obtain(Int64 lockWaitTimeout) in d:\Lucene.Net\FullRepo\trunk\src\core\Store\Lock.cs:line 83
at Lucene.Net.Index.IndexWriter.Init(Directory d, Analyzer a, Boolean create, IndexDeletionPolicy deletionPolicy, Int32 maxFieldLength, IndexingChain indexingChain, IndexCommit commit) in d:\Lucene.Net\FullRepo\trunk\src\core\Index\IndexWriter.cs:line 1228
at Lucene.Net.Index.IndexWriter..ctor(Directory d, Analyzer a, Boolean create, MaxFieldLength mfl) in d:\Lucene.Net\FullRepo\trunk\src\core\Index\IndexWriter.cs:line 1018
據我所知,「write.lock」文件是在Blob存儲中創建文件時,文件包含文本「wrote.lock」持有鎖。我從我的搜索中看到,用戶遇到了write.lock問題沒有得到清理。這似乎不是我的問題,因爲我可以在順序運行時獲得相同的代碼以正確工作,並在此情況下清除鎖定文件。
我在AzureDirectory文檔(azuredirectory.codeplex.com/documentation)中看到「索引一次只能由一個進程更新,因此通過索引角色推送所有添加/更新/刪除操作是有意義的。」但是,這沒有任何意義,因爲您創建的任何角色都應該有多個實例,因此會有多個實例並行寫入索引。此外,項目描述直接指出:「您可以有1..N個工作人員將文檔添加到和索引。」注意它表示「一個」索引,而不是索引碎片。
問:
所以,是該項目的描述只是錯?或者實際上有一種方法可以讓多個IndexWriters並行地添加到索引中?我無法在API中看到任何內容來實現這一點。如果可能,請提供一個代碼片段,說明如何使用AzureDirectory「並有1..N個角色將文檔添加到索引」。
我不明白用snide評論的倒票,然後刪除評論而不添加更具建設性的評論。這是一個有效的問題,因爲幾乎沒有關於AzureDirectory的在線信息,而且我沒有看到任何直接解決此問題的信息。從來沒有,我會試圖增加這個問題,更清楚地說明爲什麼這是一個有效的問題。 –
+1我認爲這也是一個有效的問題。 –