2011-11-24 14 views
6
# some java_imports here 
index = RAMDirectory.new 
IndexWriter.new(index, StandardAnalyzer.new(Version::LUCENE_30), IndexWriter::MaxFieldLength::UNLIMITED) 
IndexSearcher.new(index) 

generaIndexNotFoundException si IndexSearcher pidió a RAMDirectory vacío

NativeException: org.apache.lucene.index.IndexNotFoundException: no segments* file found in [email protected] [email protected]d07bb: files: [] 

¿Por qué sucede esto?

+0

¿Qué versión de Lucene estás usando? No puedo reproducir su problema usando Lucene 3.0.3 (la última versión 3.0). – jpountz

+0

3.4.0 según pacman – Reactormonk

Respuesta

11

IndexSearcher espera una estructura de directorio especial, que no puede encontrar porque no se han escrito segmentos (cuando agrega documentos a IndexWriter, se ponen en cola en la memoria y cuando la cantidad de memoria utilizada alcanza un umbral determinado o Se llama a commit(), estas estructuras de datos en memoria se vacían en el disco dando como resultado lo que Lucene llama un segmento).

Lo que necesita hacer es crear explícitamente un segmento invocando commit antes de abrir su IndexSearcher.

index = RAMDirectory.new 
writer = IndexWriter.new(index, StandardAnalyzer.new(Version::LUCENE_30),IndexWriter::MaxFieldLength::UNLIMITED) 
writer.commit() 
IndexSearcher.new(index) 

Además este constructor IndexWriter está en desuso en Lucene 3.4, se debe más bien utilizar IndexWriterConfig para configurar que IndexWriter:

iwConfig = IndexWriterConfig.new(Version::LUCENE_34, StandardAnalyzer.new(Version::LUCENE_34)) 
writer = IndexWriter.new(index, iwConfig) 
0

En lugar de llamar confirmación explícita, puede asegurarse de cerrar IndexWriter que debería implícitamente confirma y cierra recursos a partir de lucene 4