Использование Lucene для запроса базы данных RDBMS - PullRequest
4 голосов
/ 17 января 2011

Я просмотрел документы для Java-версии Lucene, но пока не вижу информации «вот как это работает» верхнего уровня (я знаю, что мне нужен RTFM, я просто могуне вижу дрова для деревьев).

Я понимаю, что Lucene использует поисковые индексы для возврата результатов.Насколько я знаю, он только возвращает "попадания" из этих индексов.Если я не добавил элемент данных при построении индекса, он не будет возвращен.

Это нормально, поэтому теперь я хочу проверить следующее предположение:

В: Означает ли это, что любые данные, которые я хочу отобразить на странице поиска, необходимо добавить в индекс Lucene?

Т.е.
Если я хочу найти Product по таким вещам, как sku, описание, название категории и т. Д., Но я также хочу отобразить Customer, которому они принадлежат, в результатах поиска, могу ли я:

  1. Убедитесь, что индекс Luceneденормализованное имя Customer в индексе.
  2. Используйте хиты, возвращаемые Lucene, чтобы каким-либо образом запросить в базе данных фактические записи продукта, и используйте JOIN, чтобы получить имя Customer.

Я предполагаю, что это вариант 1 , так как я предполагаю, что нет никакого способа "соединить" результаты запроса Lucene с RDBMS, но хотел спросить его, мои предположенияпо поводу общего использования верны.

Ответы [ 3 ]

1 голос
/ 21 декабря 2012

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

Ваша ситуация такова: Продукт СУБД (много) <------> (много) Заказчик

Вместо того, чтобы указывать ключи продукта только для индекса клиентов в lucene, а затем запрашивать СУБД с помощью IN Query, я бы предложил создать индекс lucene с декартовым продуктом Product и Customer.

Как клиент_1, продукт_1 клиент_1, продукт_2 customer_2, product_2 ..

Таким образом, когда вы ищете продукт в lucene, он даст как клиенту, так и идентификатор продукта ... и вместо того, чтобы присоединиться к ним в RDBMS, вы можете просто искать этих клиентов, а также продукты для больше информации из РСУБД, если есть необходимость. Если вы используете кеширование, то стоимость поиска дополнительных сведений также снизится.

1 голос
/ 17 января 2011

Обычно указатель содержит только те поля, по которым вы хотите искать, а не те, которые вы хотите отобразить.Индексы должны быть оптимизированы так, чтобы они были как можно меньше, чтобы обеспечить хорошую производительность поиска.

Чтобы иметь возможность отображать больше данных, добавьте поле в свой индекс, которое позволит вам получить весь документ / данные, т.е.ключ для вашего Product (идентификатор продукта?).

0 голосов
/ 17 января 2011

Основываясь на ответе BrokenGlass , я подумал еще кое-что и предлагаю следующее, чтобы проверить, нахожусь ли я на правильном пути:

В основном, выбирая вариант 2 далее, одинможет сделать следующее:

  1. Поместить в индекс Lucene только данные, по которым вы хотите выполнить поиск, плюс какое-то значение ключа (например, PK таблицы в вашей базе данных).
  2. Запрос Lucene для получения списка совпадений.
  3. Используя выбранный вами уровень доступа к данным, создайте запрос для вашей базы данных, который содержит предикат IN (value [, value]).
  4. Получите результаты для этогозапрос из вашей базы данных (который может включать в себя JOIN s для других таблиц).
  5. Поместите эти результаты в словарь, используя в качестве ключа PK набора результатов.
  6. Выполните итерацию Luceneснова по порядку, выбирая элементы из словаря, используя PK, чтобы вы могли составить список результатов в том порядке, в котором Lucene вернула попадания (т.е. отсортированные по релевантности).
  7. Показать этот «отсортированный» списокрезультаты для пользователя.

Конечно, шаги 5 и 6 могли бы быть лучше, но для пояснения я включил этот подробный метод в свое описание.Если хиты Lucene включают какое-то значение «релевантности», то вы можете приписать это результирующему набору и выполнить стандартную сортировку, но это упражнение для читателя.:)

Может ли это быть?

...