2009-11-19 36 views
0

我有一個問題,它在我的單元測試中間歇性地出現,我無法解決原因。Lucene.net間歇索引文件沒有出現在

單元測試本身將多個文檔添加到索引,然後試圖查詢索引以重新獲取文檔。

因此,95%的工作時間沒有任何問題。然後,另外5%的時間無法將文檔從索引中提取出來。

我的單元測試代碼如下:

[Test] 
    public void InsertMultipleDocuments() 
    { 
     string indexPath = null; 
     using (LuceneHelper target = GetLuceneHelper(ref indexPath)) 
     { 
      target.InsertOrUpdate(
        target.MakeDocument(GetDefaultSearchDocument()), 
        target.MakeDocument(GetSecondSearchDocument())); 

      var doc = target.GetDocument(_documentID.ToString()).FirstOrDefault(); 
      Assert.IsNotNull(doc); 
      Assert.AreEqual(doc.DocumentID, _documentID.ToString()); 

      doc = target.GetDocument(_document2ID.ToString()).FirstOrDefault(); 
      Assert.IsNotNull(doc); 
      Assert.AreEqual(doc.DocumentID, _document2ID.ToString()); 
     } 

     TidyUpTempFolder(indexPath); 
    } 

我不會從我的LuceneHelper發佈完整的代碼,但它的基本思想是,它擁有一個IndexSearcher的參考是封閉的,每次一個項目被寫入索引(所以它可以重新打開所有的最新文檔)。

收集第二個文檔時,實際的單元測試通常會失敗。我認爲這是與搜索器沒有關閉並看到緩存數據有關,但事實並非如此。

Lucene是否有延遲向索引添加文檔?我認爲,只要您關閉了任何舊的搜索索引器並打開了一個新索引器,它就會立即將索引文件添加到索引中。

任何想法?

回答

0

如何關閉用於更新索引的IndexWriter? close方法有一個重載,它接受一個布爾參數,指定是否要等待合併完成。默認合併調度程序在單獨的線程中運行合併,這可能會導致您的問題。

嘗試關閉作家是這樣的:

indexWriter.Close(true); 

更多信息,Lucene.NET documentation找到。

順便說一句,您正在使用Lucene.NET的哪個版本?

+0

這聽起來像它會解決它,但我仍然intermitently遇到同樣的問題。 我其實不介意在後臺執行此操作,但是我希望在完成操作後收到通知。這可能嗎? – 2009-11-20 00:07:16

+0

我不認爲有可能在沒有調用閉合Close(true)方法的情況下找出合併完成的時間。 – HakonB 2009-11-20 07:37:15