IndexWriter.commit() недостаточно для изменения индекса

Я только что перенес нашу реализацию Lucene на 4.9 из 3.1, и я все еще не могу обновить документы в моем индексе без forceMerge(1) (раньше был оптимизатором). Я понимаю, что всякий раз, когда я обновляю документ, старый документ помечается как удаленный, а новый документ сохраняется в новом сегменте / файле. Результат, который я продолжаю видеть даже после обновления, заключается в том, что документ помечен как удаленный, но поисковики никогда не видят новый сегмент. Поиски этого документа просто пусты. Почему это не работает?

Код, который я рассчитываю на работу:

IndexWriter indexWriter =
        new IndexWriter(FSDirectory.open(indexDirectoryFile),
            getIndexWriterConfig());
Document document = buildDocument(p);
indexWriter.updateDocument(
    new Term(SKU_FIELD_NAME, p.getSku().toString()), document);
indexWriter.commit();
indexWriter.close();
searcherManager.maybeRefresh();

Код, который работает:

IndexWriter indexWriter =
        new IndexWriter(FSDirectory.open(indexDirectoryFile),
            getIndexWriterConfig());
Document document = buildDocument(p);
indexWriter.updateDocument(
    new Term(SKU_FIELD_NAME, p.getSku().toString()), document);
indexWriter.commit();
**indexWriter.forceMerge(1,true);**
indexWriter.close();
searcherManager.maybeRefresh();

1 ответ

Индекс был изменен после фиксации, это SearcherManager который дает вам ложное впечатление.

Что это maybeRefresh() вернуть? Если false, это означает, что индекс обновляется другим потоком (для больших индексов требуется время). Пока это обновление не закончено, другие потоки просто должны жить с устаревшим читателем / поисковиком.

Если вы хотите проверить это, откройте новый IndexReader явно (без SearcherManager) и сделайте запрос после commit(), Могу поспорить, вы увидите обновленные данные в результатах поиска.

Другие вопросы по тегам