Lucene.net периодически индексирует документы, не появляющиеся в - PullRequest
0 голосов
/ 19 ноября 2009

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

Сам модульный тест добавляет несколько документов в индекс, а затем пытается запросить индекс, чтобы вернуть документы обратно.

Так что 95% времени все работает без проблем. Затем остальные 5% времени он не может извлечь документы обратно из индекса.

Код моего модульного теста выглядит следующим образом:

[Test]
    public void InsertMultipleDocuments()
    {
        string indexPath = null;
        using (LuceneHelper target = GetLuceneHelper(ref indexPath))
        {
            target.InsertOrUpdate(
                    target.MakeDocument(GetDefaultSearchDocument()), 
                    target.MakeDocument(GetSecondSearchDocument()));

            var doc = target.GetDocument(_documentID.ToString()).FirstOrDefault();
            Assert.IsNotNull(doc);
            Assert.AreEqual(doc.DocumentID, _documentID.ToString());

            doc = target.GetDocument(_document2ID.ToString()).FirstOrDefault();
            Assert.IsNotNull(doc);
            Assert.AreEqual(doc.DocumentID, _document2ID.ToString());
        }

        TidyUpTempFolder(indexPath);
    }

Я не буду публиковать полный код из моего LuceneHelper, но основная идея этого заключается в том, что он содержит IndexSearcher в качестве ссылки, который закрывается каждый раз, когда элемент записывается в индекс (поэтому его можно снова открыть снова со всеми последними документами).

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

Есть ли у Lucene какие-либо задержки с добавлением документов в индекс? Я предположил, что после добавления документа в индекс он был доступен немедленно, если вы закрыли все старые поисковые индексы и открыли новый.

Есть идеи?

1 Ответ

0 голосов
/ 19 ноября 2009

Как вы закрываете IndexWriter, который вы используете для обновления индекса? Метод close имеет перегрузку, которая принимает один логический параметр, указывающий, хотите ли вы дождаться завершения слияния. Планировщик слияний по умолчанию выполняет слияния в отдельном потоке, и это может вызвать ваши проблемы.

Попробуйте закрыть писателя так:

indexWriter.Close(true);

Дополнительную информацию можно найти на документации Lucene.NET .

Кстати, какую версию Lucene.NET вы используете?

...