2009-11-19 1 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에서 찾을 수 있습니다.

Btw, Lucene.NET의 어떤 버전을 사용하고 있습니까?

+0

이 문제는 해결 될 것 같지만, 여전히 동일한 문제가 간헐적으로 발생하고 있습니다. 실제로 백그라운드에서이 작업을 수행하는 것을 신경 쓰지는 않지만 일단 완료되면 알림을 받고 싶습니다. 이것이 가능합니까? –

+0

차단 닫기 (true) 메서드를 호출하지 않고 병합이 완료되면 알아낼 수 있다고 생각하지 않습니다. – HakonB