Apache Solr — индексирование ZIP-файлов

Мое веб-приложение — это служба электронной почты. Он хранит сообщения электронной почты в базе данных 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&#038;
              characterEncoding=UTF-8&#038;
              useTimezone=true&#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 = "\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 выше.

Это возможно?

Предполагая, что вы используете современную версию Solr с современной версией Tika, вам необходимо установить для extractEmbedded значение true в конфигурации TikaEntityProcessor, чтобы он мог анализировать встроенные документы.

Dave Meikle 28.12.2020 21:48

@DaveMeikle Спасибо за правильное решение. Я также думаю перейти на SolrJ, так как DIH, похоже, скоро перестанет поддерживаться.

user164863 30.12.2020 16:34

Да, в самом деле. Его планируется удалить в версии 9.0. Есть пакет, который вы можете использовать здесь, но SolJ — хороший маршрут.

Dave Meikle 30.12.2020 20:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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>

Смотрите здесь для более подробной информации.

Другие вопросы по теме