Мое веб-приложение — это служба электронной почты. Он хранит сообщения электронной почты в базе данных MySQL, а вложения электронной почты находятся на диске.
База данных похожа на:
----------------------------------------------------------------------
| id | sender | receiver | subject | body | attach_dir | attachments |
----------------------------------------------------------------------
| 2 | 444 | 555 | Apples | Hey! | /mnt/emails| att1.doc\r\n|
| | | | | | | att2.doc\r\n|
----------------------------------------------------------------------
| 3 | 77 | 22 | Pears | Hola!| /mnt/emails| att1.zip\r\n|
----------------------------------------------------------------------
Я индексирую его следующим data-config.xml:
<dataConfig>
<dataSource name = "mysql"
type = "JdbcDataSource"
driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost:3306/email?
useUnicode=true&
characterEncoding=UTF-8&
useTimezone=true&
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 = "\r\n" />
<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 выше.
Это возможно?
@DaveMeikle Спасибо за правильное решение. Я также думаю перейти на SolrJ, так как DIH, похоже, скоро перестанет поддерживаться.
Да, в самом деле. Его планируется удалить в версии 9.0. Есть пакет, который вы можете использовать здесь, но SolJ — хороший маршрут.




Вам необходимо установить для 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>
Смотрите здесь для более подробной информации.
Предполагая, что вы используете современную версию Solr с современной версией Tika, вам необходимо установить для extractEmbedded значение true в конфигурации TikaEntityProcessor, чтобы он мог анализировать встроенные документы.