IndexNotFoundException si IndexSearcher invocó RAMDirectory vacío
lucene jruby (2)
# some java_imports here
index = RAMDirectory.new
IndexWriter.new(index, StandardAnalyzer.new(Version::LUCENE_30), IndexWriter::MaxFieldLength::UNLIMITED )
IndexSearcher.new(index)
genera
NativeException: org.apache.lucene.index.IndexNotFoundException: no segments* file found in org.apache.lucene.store.RAMDirectory@668c640e lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@afd07bb: files: []
¿Por qué pasó esto?
El IndexSearcher espera una estructura de directorio especial, que no puede encontrar porque no se han escrito segmentos (cuando agrega documentos a un IndexWriter, se ponen en cola en la memoria, y cuando la cantidad de memoria utilizada alcanza un umbral dado o cuando commit () es llamado, estas estructuras de datos en memoria se enjuagan en el disco dando como resultado lo que Lucene llama un segmento).
Lo que debe hacer es crear explícitamente un segmento llamando a 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 de IndexWriter está en desuso en Lucene 3.4, debería usar IndexWriterConfig para configurar IndexWriter:
iwConfig = IndexWriterConfig.new(Version::LUCENE_34, StandardAnalyzer.new(Version::LUCENE_34))
writer = IndexWriter.new(index, iwConfig)
En lugar de llamar al compromiso explícito, puede asegurarse de cerrar IndexWriter, que debe comprometer implícitamente y cerrar recursos a partir de lucene 4