2014-02-28 2 views
2

검색 색인을 동시에 읽고 쓸 수 있어야하는 응용 프로그램이 있습니다. 필자가 주목 한 점은 IndexWriter와 DirectoryReader를 동시에 사용할 수 없다는 점입니다. 기본적으로 : Lucene에서 동시 읽기 및 쓰기

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46)); 
IndexWriter writer = new IndexWriter(directory, config); 
writer.commit(); 
DirectoryReader reader = DirectoryReader.open(writer.getDirectory()); 

//Add documents here 

writer.commit(); 
IndexSearcher searcher = new IndexSearcher(reader);  
QueryParser qp = new QueryParser(Version.LUCENE_46,"field", new StandardAnalyzer(Version.LUCENE_46)); 
qp.setAllowLeadingWildcard(true); 
Query q = qp.parse("field:*"); 

가 전혀 작동하지 않는 동안

IndexWriter writer = new IndexWriter(directory, config); 
//Add documents here... 
writer.commit(); 

DirectoryReader reader = DirectoryReader.open(writer.getDirectory()); 
IndexSearcher searcher = new IndexSearcher(reader);  
QueryParser qp = new QueryParser(Version.LUCENE_46,"field", new StandardAnalyzer(Version.LUCENE_46)); 
qp.setAllowLeadingWildcard(true); 
Query q = qp.parse("field:*"); 

는 잘 작동합니다.

각 커밋 후에 DirectoryReader를 다시 열어야합니까?

+1

예. 재개해야합니다. 대안으로 Near-Realtime Reader가 있습니다. 이 블로그 항목을 확인하십시오 : http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html –

답변

1

우리가 두 snippies 사이의 주요 차이점은 IndexWriter에서 독자가 있는데, 처음에는 writer.commit() 다음에 있음을 알 수 있습니다. 우리는 독자를 받았을 때


, 즉 우리가 현재 색인 파일의 일회성 스냅 샷을 가지고 의미, 두 번째 readerIndexWriter.commit 전에 "스냅 샷"을 가지고, 그것은 IndexSearcher 것으로 판명됩니다 그것을 기반으로 reader 변경 내용을 찾지 못했습니다 IndexWriter 방금 ​​만든 또는 인덱스 일관된 상태가 아닙니다.

그래서 DirectoryReader를 다시 열어야합니다. 이들이 도움이되기를 바랍니다! : D