Lucene, похоже, кэширует результаты поиска - почему?

StackOverflow https://stackoverflow.com/questions/1802277

  •  05-07-2019
  •  | 
  •  

Вопрос

В моем проекте мы используем Lucene 2.4.1 для полнотекстового поиска.Это проект J2EE, IndexSearcher создается один раз.В фоновом режиме индекс обновляется каждые пару минут (при изменении содержимого).Пользователи могут выполнять поиск по индексу с помощью механизма поиска на странице.

Проблема в том, что результаты, возвращаемые Lucene, похоже, каким-то образом кэшируются.

Это сценарий, который я заметил:

  • Я запускаю приложение и выполняю поиск по 'ключевому слову' - возвращается 6 результатов,
  • Индекс обновляется, используя Люк Я вижу, что теперь есть 8 результатов для запроса "ключевое слово",
  • Я снова выполняю поиск с помощью приложения, и снова возвращается 6 результатов.

Я проанализировал нашу конфигурацию и нигде не нашел никакого кэширования.Я отладил поиск, и в исходном коде нет кэширования, searcher.search возвращает 6 результатов.

Кэширует ли Lucene каким-то образом результаты внутри компании?Какие свойства и т.д.должен ли я проверить?

Это было полезно?

Решение

Чтобы увидеть изменения, внесенные IndexWriters в индекс, для которого у вас есть открытый IndexReader, обязательно вызовите IndexReader.повторно открыть() чтобы увидеть последние изменения.

Убедитесь также, что ваш Индексатор фиксирует изменения либо с помощью явной фиксации(), close(), либо с установленным значением автоматической фиксации true.

Другие советы

В версиях, предшествующих 2.9.0, Lucene автоматически кэшировала результаты запросов.В более поздних версиях кэширование отсутствует, если вы не обернете свой запрос в QueryFilter, а затем результат в CachingWrapperFilter .Вы могли бы рассмотреть возможность перехода на версию >= 2.9.0, если повторное открытие индекса становится проблемой

Еще одно замечание:Чтобы IndexReader мог находить обновленные документы других потоков в режиме реального времени, при инициализации IndexReader параметр "только для чтения" должен быть false.В противном случае метод reopen() не будет работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top