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, который не дает мне такого хорошего ощущения, но эта миграция все еще находится на начальных этапах, поэтому я буду оставлять суждение на некоторое время.