Подтвердить что ты не робот

Org.apache.lucene.index.IndexNotFoundException: нет сегментов * файла, найденного в org.apache.lucene.store.RAMDirectory

Я новичок в Java и Lucene. Мой код получает строку из файла и сохраняет ее в индексе Lucene. Но когда я создаю IndexReader для поиска и чтения из индекса, он генерирует исключение.

Мой код java ниже. При создании IndexReader он выдает IndexNotFoundException

static String itemsfreq[];
static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
static IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);

public static void index_data(Directory indexed_document,int doc_num,IndexWriter w) throws IOException
    {
    for(int i = 0;i < itemsfreq.length;i++)
        {
        Document doc = new Document();
        doc.add(new Field(Integer.toString(doc_num)+","+itemsfreq[i],itemsfreq[i++], Field.Store.YES, Field.Index.ANALYZED));
        w.addDocument(doc);
        }
    }
//Gets string from a file and insert it in INDEX named indexed_document
public static void main(String[] args) throws IOException
    {
    BufferedReader reader = new BufferedReader(new FileReader("fullText100.txt"));
    String line;
    int i = 0;
    Directory indexed_document = new RAMDirectory();
    IndexWriter writer = new IndexWriter(indexed_document, config);
    while((line=reader.readLine()) != null)
        {
        if(i == 1)
            {
            break;
            }
        itemsfreq = line.split(" ");
        index_data(indexed_document,i,writer);
        i++;
        }

    IndexReader r = IndexReader.open(indexed_document);
    } 
4b9b3361

Ответ 1

прежде чем открыть индекс с помощью считывателя, вызовите один раз writer.commit()

Ответ 2

Чтобы записать изменения в индекс, вам нужно закрыть индексную запись, а затем открыть IndexReader.

writer.close();

Если вам нужно открыть IndexReader до того, как запись будет завершена, вы должны указать IndexReader повторно открыть индекс, чтобы увидеть изменения.

Ответ 3

Вам нужно сделать это, чтобы явным образом вызвать commit, прежде чем открыть IndexSearcher.

    directory = new RAMDirectory();
    iwriter = new IndexWriter(directory, config);
    iwriter.commit();

Теперь открыть Searcher

ireader = DirectoryReader.open(directory);
isearcher = new IndexSearcher(ireader);

Также помните, что вам нужно позвонить commit после добавления документов, иначе поиск может не найти его. Искатель должен быть вновь открыт после совершения (конечно, закрыть старого искателя).

iwriter.commit();

Ответ 4

Я получил эту ошибку (в Lucene.Net, С#), потому что я создал индекс, создав соответствующий каталог в моей файловой системе и FSDirectory в памяти, но на самом деле еще не добавил никаких документов.

В частности, код для добавления новых документов проверял, чтобы он не добавлял дубликат с читателем, но при попытке добавить первый документ было исключено исключение, потому что еще не было сегментов.

Я имел дело с этим так:

// Make a reader to check the index for duplicates
// The reader will only be aware of items that were in the index before it was created
IndexReader reader = null;
try {
    reader = IndexReader.Open( index, true );
} catch( IOException ) {
    // There is no segments file because the index is empty
    reader = null;
}

... // inside a method called by that scope, with reader passed in

// See if it exists already
// If the reader is null, then the index is empty
if( reader != null ) {
    var existsTerm = new Term( SingleFieldIndexManager.FieldName, formattedTerm );
    var matches = reader.TermDocs( existsTerm );
    if( matches.Next() ) {
        // It already in there, no need to add again
        return;
    }
}

... // back to the first method after a return

// dispose of the reader if we managed to create one
if( reader != null ) {
    reader.Dispose();
}