exception lucene jruby

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