2011-10-14 2 views
2

У меня есть сложный запрос, который требует полнотекстового поиска по некоторым полям и основным ограничениям для других полей. Hibernate Документация поиска strongly advises against добавление ограничений на запрос базы данных для полнотекстового поискового запроса и вместо этого recommends помещение всех необходимых полей в полнотекстовый индекс. Проблема, с которой я сталкиваюсь, заключается в том, что другие поля нестабильны; значения могут меняться каждую минуту или около того, и эти обновления в базе данных могут происходить за пределами JVM, выполняющего поиск, поэтому существует высокая вероятность того, что локальный индекс Lucene будет устаревшим по отношению к этим полям.Слияние Hibernate Результаты поиска с реляционной базой данных

Ищите рекомендации по стратегии здесь. Самое лучшее, что я придумал до сих пор, - это объединить результаты вручную, сначала выполнив запрос базы данных (выборка только идентификаторов объектов), а затем выполните полный текстовый поиск. и как-то эффективно фильтровать результаты Lucene по набору идентификаторов объектов из базы данных. Конечно, я не знаю, сколько результатов я получу от каждого отдельного запроса, поэтому я беспокоюсь о производительности и памяти. Это может быть десятки тысяч строк за штуку в худшем случае.

ответ

0

Меня интересуют другие идеи для этого, поскольку у нас очень похожий сценарий.

Нам нужно было всего лишь показать 50 строк результатов максимум с помощью нескольких поисков в строке. Мы запускаем запрос против индекса lucene с идентификаторами db pk в индексе и вытягиваем поиск из базы данных в строке. Это все еще для нас.

Как вы, кажется, хотите обработать более нескольких строк и поисков, я рассмотрел альтернативу. Временная метка обновляет строку db. Это позволило бы нам запросить БД для устаревших индексов, а затем итеративно вызвать переиндекс связанных документов.

0

У меня такая же проблема и выполняю отдельный запрос Lucene и критериев. Если я сначала сделаю запрос критериев, я буду использовать полученные идентификаторы для применения пользовательского IdFilter для поиска Lucene, который проверяет, является ли результат в данной коллекции идентификаторов первым запросом. Однако этот подход не очень хорошо масштабируется, потому что в моем случае количество результатов после первого запроса может быть огромным, а фильтр ограничен 1024 идентификаторами. Я не нашел хорошего решения, но я изменяю порядок моих двух запросов в зависимости от числа ожидаемых результатов. Первый запрос должен быть тем, который отфильтровывает большую часть результатов.

0

Вы можете создать базу обновления индекса планировщика в последнюю измененную дату.

 Смежные вопросы

  • Нет связанных вопросов^_^