Hibernate Search, Lucene или любая другая альтернатива? - PullRequest
10 голосов
/ 25 мая 2011

У меня есть запрос, который выполняет ILIKE для 11 строковых или текстовых полей таблицы, который невелик (500 000), но для ILIKE, очевидно, слишком большой, поисковый запрос занимает около 20 секунд.База данных postgres 8.4

Мне нужно, чтобы этот поиск был намного быстрее.

Что мне пришло в голову:

  1. Я сделал дополнительный столбец TVECTOR, собранный из всех столбцов, которые нужно найти, и создал для него полнотекстовый индекс.Полнотекстовый поиск был довольно быстрым.Но ... я не могу отобразить этот тип TVECTOR в моем .hbms.Так что эта идея отпала (во всяком случае, я подумал, что это скорее временное решение).

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

  3. Lucene

В любом случае, это произошло сейчас с этой таблицей, но я хотел бы, чтобы решение было более общим и применялось для будущих случаев, связанных с полным текстомпоиски.

Все советы приветствуются!

Спасибо

Ответы [ 6 ]

12 голосов
/ 25 мая 2011

Я бы настоятельно рекомендовал Hibernate Search, который обеспечивает очень простой в использовании мост между Hibernate и Lucene. Помните, что вы будете использовать оба здесь. Вы просто аннотируете свойства классов вашего домена, по которым вы хотите выполнять поиск. Затем, когда вы обновляете / вставляете / удаляете объект, который включен для поиска, Hibernate Search просто обновляет соответствующие индексы. Это произойдет только в том случае, если транзакция, в которой произошли изменения в базе данных, была зафиксирована, т. Е. При ее откате индексы не будут нарушены.

Итак, чтобы ответить на ваши вопросы:

  1. Да, вы можете индексировать определенные столбцы в определенных таблицах. У вас также есть возможность токенизировать содержимое поля, чтобы можно было сопоставлять его части.

  2. Нетрудно использовать вообще, вы просто решаете, какие свойства вы хотите найти. Скажите Hibernate, где хранить его индексы. И затем можно использовать интерфейсы EntityManager / Session для загрузки искомых объектов.

6 голосов
/ 26 мая 2011

Поскольку вы уже используете Hibernate и Lucene, Hibernate Search является отличным выбором.

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

Вы сможете указать, какие конкретные поля в каждой сущности вы хотите проиндексировать, а также добавить несколько типов индексов по мере необходимости (например, основанные на полноте и полнотекстовые). Вы также сможете управлять индексированием графа для ассоциаций, чтобы вы могли выполнять довольно сложные запросы через Search / Lucene.

Я обнаружил, что для расширенного поиска текста лучше использовать Hibernate Search, но вернитесь к обычному Hibernate для более традиционного поиска и гидратации сложных графов объектов для отображения результатов.

0 голосов
/ 22 февраля 2012

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

Тем не менее, больше нет разработки для Compass, когда усилия перешли на ElasticSearch. По веб-сайту этого проекта я не могу точно определить, готов ли он к Большому Времени или даже уже жив.

Так что я переключаюсь на Hibernate Search, который не дает мне такого хорошего ощущения, но эта миграция все еще находится на начальных этапах, поэтому я оставлю за собой суждение еще немного.

0 голосов
/ 25 мая 2011

Все проекты основаны на Lucene. Если вы хотите реализовать очень продвинутые функции, я советую вам использовать Lucene напрямую. Если нет, вы можете использовать Solr , который является мощным API поверх lucene, который может помочь вам индексировать и искать в БД.

0 голосов
/ 25 мая 2011

В прошлом я использовал Lucene для индексации таблиц базы данных.Решение отлично работает, но помните, что вам нужно поддерживать индекс.Либо вы обновляете индекс каждый раз, когда ваши объекты сохраняются, либо у вас есть индексатор демонов, который выводит таблицы базы данных в ваш индекс Lucene.

Рассматривали ли вы Solr ?Он построен на основе Lucene и предлагает автоматическую индексацию из БД и API отдыха.

0 голосов
/ 25 мая 2011

Я рекомендую Компас .Это проект с открытым исходным кодом, построенный на основе Lucene, который предоставляет более простой API (чем Lucene).Он прекрасно интегрируется со многими распространенными библиотеками и средами Java, такими как Spring и Hibernate.

...