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()
, Могу поспорить, вы увидите обновленные данные в результатах поиска.