Как искать объекты домена и физические файлы, которые они указывают на использование Solr или поиска - PullRequest
1 голос
/ 23 октября 2010

У меня есть система цифровой библиотеки, в которой я храню метаданные и путь к физическому файлу в базе данных.Файлы могут быть любыми: обычный текст, Word, PDF, MP3, JPEG, MP4 ...

. Как я могу обеспечить полнотекстовый поиск как для объектов моего домена, так и для физических файлов (или некоторое извлечение текста изфайлы).

Является ли мой единственный выбор для сохранения текста документа в доменном объекте?Мне нужно иметь возможность получать список объектов домена независимо от того, получены ли результаты поиска от объекта домена или физического документа.Конечно, возможно соединение с использованием пути к файлу, и я на самом деле помещаю каждый документ в папку с именем GUID, поэтому соединение существует.

Мне нужно сделать это в Grails, в идеале, используя solr илиплагин с возможностью поиска, но решение Java поможет.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2010

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

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

Спасибо.

0 голосов
/ 23 октября 2010

Вам не нужно хранить содержимое в объекте домена, просто связывайте содержимое с объектом домена при создании записи индекса. Я использовал Apache POI для извлечения моего контента, но есть сервисы более высокого уровня, такие как Apache Tika

Вы можете кодировать его в Java, используя Lucene напрямую, но я бы предложил SOLR вместо

модуль поиска Grails на основе Компас на основе Lucene

...