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

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

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

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

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

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

  3. Люсен

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

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

спасибо


person Julia    schedule 25.05.2011    source источник


Ответы (6)


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

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

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

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

person Alex Barnes    schedule 25.05.2011
comment
спасибо за пояснения, еще один короткий вопрос, я хочу иметь возможность искать по нескольким строковым полям. Имеет ли смысл хранить все остальные поля в индексе, но не делать их доступными для поиска, а затем, когда я нажму, я получу объект оттуда, или я должен просто получить IDS и перейти к базе данных, чтобы получить их ? - person Julia; 26.05.2011
comment
@Julia Вы должны индексировать только те поля, в которых хотите искать. Вы сообщаете Hibernate Search, что такое @DocumentId (также @Id) индексируемого объекта. Затем Hibernate будет использовать этот идентификатор для получения объекта из базы данных (или кэша сеанса), не беспокоясь об этом. По сути, Hibernate Search берет строку поиска и возвращает объекты домена, соответствующие этому поиску. Аккуратно да? - person Alex Barnes; 26.05.2011

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

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

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

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

person Stevi Deter    schedule 25.05.2011

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

person Dónal    schedule 25.05.2011

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

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

person Luciano Fiandesio    schedule 25.05.2011
comment
спасибо мы уже используем lucene для индексации документов, поэтому я думаю, что лучше придерживаться одной и той же библиотеки. Как с помощью Lucene, например, я хочу проиндексировать некоторые отношения объектов? Должен ли я индексировать целые таблицы или я могу сделать определенные столбцы, которые мне нужны, из основной таблицы и некоторых ее отношений? - person Julia; 25.05.2011
comment
То, как я это сделал, заключалось в использовании запросов SELECT с JOINS для создания плоской структуры моих данных, чтобы я мог запускать для них индексатор. Это один подход. Вы также можете использовать хранимые процедуры для сведения ваших данных в специальную таблицу, используемую для индексации. - person Luciano Fiandesio; 25.05.2011

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

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

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

person Gwaptiva    schedule 22.02.2012

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

person Houcem Berrayana    schedule 25.05.2011
comment
Я думаю, мне не понадобятся слишком продвинутые функции, но я хотел бы избежать использования новой библиотеки, которую мы пока не используем. Я не уверен, что понял, почему вы рекомендуете Solr, который в любом случае построен на lucene? Не могли бы вы немного уточнить, пожалуйста? Спасибо вам!!! - person Julia; 26.05.2011
comment
Я приведу вам пример: вам нужно сделать HTTP-запросы на веб-сервер. В java есть библиотека сокетов, которая поможет вам в этом, но есть и лучше: http-клиент apache commons. Это именно то, что поставляется со встроенными библиотеками, реализующими протокол. То же самое для Solr, который имеет встроенный API для управления индексами, простой полнотекстовый поиск с простой интеграцией с базой данных и предназначен для запуска контейнера сервлетов. - person Houcem Berrayana; 26.05.2011