Hibernate Search, Lucene или любая другая альтернатива?

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

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

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

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

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

  • Lucene

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

Все советы оценены!

Thanx

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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