IndexNotFoundException, если IndexSearcher вызван на пустой RAMDirectory - PullRequest
6 голосов
/ 25 ноября 2011
# some java_imports here
index = RAMDirectory.new
IndexWriter.new(index, StandardAnalyzer.new(Version::LUCENE_30), IndexWriter::MaxFieldLength::UNLIMITED )
IndexSearcher.new(index)

создает * * тысяча два

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: []

Почему это происходит?

Ответы [ 2 ]

11 голосов
/ 28 ноября 2011

IndexSearcher ожидает особую структуру каталогов, которую он не может найти, потому что ни один сегмент не был записан (когда вы добавляете документы в IndexWriter, они помещаются в очередь в памяти, а также когда объем используемой памяти достигает заданного порога или когда происходит фиксация() вызывается, эти структуры данных в памяти сбрасываются на диск, что приводит к тому, что Lucene называет сегментом.)

Вам нужно явно создать сегмент, вызвав commit до открытия IndexSearcher.

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

Более того, этот конструктор IndexWriter устарел в Lucene 3.4, вам лучше использовать IndexWriterConfig для настройки IndexWriter:

iwConfig = IndexWriterConfig.new(Version::LUCENE_34, StandardAnalyzer.new(Version::LUCENE_34))
writer = IndexWriter.new(index, iwConfig)
0 голосов
/ 25 декабря 2013

Вместо того, чтобы вызывать явную фиксацию, вы можете убедиться, что закроете IndexWriter, который должен неявно фиксировать и закрыть ресурсы начиная с lucene 4

...