#java #solr #lucene #extract #apache-tika
#java #solr #lucene #извлечь #apache-tika
Вопрос:
Мое веб-приложение — это служба электронной почты. Он хранит сообщения электронной почты в базе данных MySQL, а вложения электронной почты находятся на диске.
База данных похожа на:
----------------------------------------------------------------------
| id | sender | receiver | subject | body | attach_dir | attachments |
----------------------------------------------------------------------
| 2 | 444 | 555 | Apples | Hey! | /mnt/emails| att1.docrn|
| | | | | | | att2.docrn|
----------------------------------------------------------------------
| 3 | 77 | 22 | Pears | Hola!| /mnt/emails| att1.ziprn|
----------------------------------------------------------------------
Я индексирую его следующим образом data-config.xml:
<dataConfig>
<dataSource name="mysql"
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/email?
useUnicode=trueamp;#038;
characterEncoding=UTF-8amp;#038;
useTimezone=trueamp;#038;
serverTimezone=UTC"
user="user"
password="pass"/>
<dataSource name="files"
type="BinFileDataSource" />
<document>
<entity name="email" dataSource="mysql"
query="SELECT id, subject, body, date, attach, attach_dir FROM email"
transformer="RegexTransformer"
>
<field column="id" name="id"/>
<field column="subject" name="subject"/>
<field column="body" name="content"/>
<field column="date" name="last_modified"/>
<field column="attach" name="attach" splitBy="rn" />
<field column="attach_dir" name="attach_dir"/>
<entity name="attach_glob" dataSource="null"
processor="FileListEntityProcessor"
baseDir="/mnt/attach/${email.attach_dir}" fileName=".*"
recursive="false" onError="skip">
<entity name="email_attachment" dataSource="files"
processor="TikaEntityProcessor"
url="${attach_glob.fileAbsolutePath}">
<field column="text" name="attach_content"/>
</entity>
</entity>
</entity>
</document>
</dataConfig>
Это хорошо работает со всеми файлами, кроме сжатых файлов, таких как .zip
. Для .zip
файлов attach_content
поле заполняется только именами файлов из zip-архива, а не содержимым извлеченных файлов из zip-архивов.
Однако, если я использую SimplePostTool
так:
/opt/solr/bin/post -c mycollection /mnt/attach/message3/att1.zip
затем я получаю все содержимое, извлеченное из всех файлов внутри zip-архива, и это то, что мне нужно. Но мне нужно, чтобы это содержимое было частью документов, добавленных обработчиком импорта данных с помощью data-config.xml выше.
Возможно ли это?
Комментарии:
1. Предполагая, что вы используете современную версию Solr с современной версией Tika, вам нужно установить для extractEmbedded значение true в конфигурации TikaEntityProcessor, чтобы он анализировал встроенные документы.
2. @DaveMeikle Спасибо за правильную вещь. Я также подумываю переключиться на SolrJ, поскольку DIH, похоже, скоро перестанет поддерживать.
3. Да, действительно. Его планируется удалить в версии 9.0. Существует пакет, который вы можете использовать здесь , но SolJ — хороший маршрут.
Ответ №1:
Вам нужно установить extractEmbedded в true в конфигурации TikaEntityProcessor, чтобы он установил соответствующий анализатор в Apache Tika ParseContext для анализа встроенных документов.
Например, вы можете изменить конфигурацию из вопроса, чтобы установить этот набор, как показано ниже:
<entity name="email_attachment" dataSource="files"
processor="TikaEntityProcessor"
url="${attach_glob.fileAbsolutePath}" extractEmbedded="true">
<field column="text" name="attach_content"/>
</entity>
Смотрите здесь для получения более подробной информации.