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

#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>
 

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