Ознакомьтесь с этой статьей , которая охватывает варианты использования, подобные вашему, на основе Spring , Hibernate , Hibernate Search и JSF.Он поставляется с полным, хорошо документированным, образцом приложения .
, в котором основное внимание уделяется разделению интересов парадигме и модульности , BTW,Таким образом, соответствующие концепции, касающиеся полнотекстового поиска, должны хорошо подходить для Grails или других приложений на основе Java.
Основной класс домена - это de.metagear.library.model.Media
(естьсвязанный с ним MetaData
класс домена тоже).Вы сможете смешивать классы Hibernate и GORM;однако тогда вам нужно будет использовать другие API.
Класс Media
содержит свойство plainText
:
@Column(name = "plain_text", nullable = false)
@Field(index = Index.TOKENIZED, store = Store.YES)
@Lob
private String plainText;
Это свойство содержит извлеченный текст (т. е. из PDF-файлов и т. д.).Я не уверен, нужно ли его сохранять в базе данных или нет (вероятно, нет, но в противном случае это не должно сильно навредить).Тем не менее, не используется для полнотекстового поиска (см. Ниже).Для полнотекстового поиска используются только индексы Lucene.
Перед созданием Media
извлекается текстовое содержимое соответствующего оригинального документа (возможно, двоичного).Метод de.metagear.library.model.factory.MediaFactory.getInstance(..)
извлекает текст , сохраняет извлеченный текст в новый объект Media
и возвращает это Media
.
. В примере он просто сохраняет исходный документв свойство объекта домена, но в этом месте вы также можете сохранить документ в файл и сохранить ссылку (упомянутый вами GUID) в свойство Media
.
класс домена сохраняется классом de.metagear.library.dao.MediaCrudDaoImpl
, который является компонентом Spring.Внутренне, он использует вставленный EntityManagerFactory
, который в / applicationContext.xml был определен для использования Hibernate под капотом.
Индексирование происходит автоматически,из-за аннотаций Hibernate в классе домена.
Что касается выполнения полнотекстового поиска , то это достигается методом de.metagear.library.dao.MediaSearchDaoImpl.getSearchResults(..)
, который выполняет , а не запрос.база данных, но только индексы Lucene.
Пример приложения содержит мощный обработчик терминов запроса, который может объединять операторы AND, OR и NOT для разных индексов, сохраняя при этом всеобъемлющий синтаксис Lucene выражений..
Установив пользовательское значение org.hibernate.transform.ResultTransformer
в этом месте, можно возвращать объекты любого типа (включая, конечно, классы домена).
У меня нетзаглянул в плагин Grails Searchable, и, таким образом, не может сказать, насколько он жизнеспособен с точки зрения надежности, удобства обслуживания, простоты использования и, что немаловажно, расширяемостиПользовательские или сторонние экстракторы контента, парсеры и анализаторы.Возможно, это тоже так.
В конце концов, в моем подходе есть базовые знания о Spring и (возможно) Hibernate.Это только те основы, на которых основаны Grails и Gorm, но я думаю, что это может стать для вас точкой принятия решения.
По крайней мере, рассмотрение вышеупомянутых концепций должно быть информативным и дать возможность продвигаться вперед при поискена разных основах и подходах.
Спасибо.