如何使用Solr 4.0+索引包含为数据库BLOB的富格式文档?

时间:2013-02-28 23:34:48

标签: database solr blob apache-tika solr-cell

我找到了一些解决这个问题的相关解决方案。我将解释相关的解决方案对我不起作用。 (我正在使用Solr 4.0并将索引数据存储在Oracle 11g数据库中。)

Jonck van der Kogel的相关解决方案(自2009年起)解释here。他描述了创建一个自定义的Transformer,有点像Solr附带的ClobTransformer。这是优雅的道路,但没有使用现在与Solr集成的Tika。 (他使用外部PDFBox和FontBox。)这会创建多个维护/升级依赖项。此外,除了PDF之外,我还需要能够索引Word文档。

由于Kogel的解决方案似乎走在正确的道路上,有没有办法在定制的变压器中使用Solr附带的Tika类?这将使Kogel的优雅数据库解决方案具备所有Tika功能。

另一个相关的解决方案是Solr附带的ExtractingRequestHandler(ERH)。但是,顾名思义,这是一个请求处理程序,例如处理富文本文档的HTTP帖子。从数据库中提取文档这种方式存在性能和安全问题。我必须通过HTTP访问数据库BLOB。我没有发现使用ERH从数据库BLOB直接摄取的讨论。是否可以使用Solr Cell直接从数据库BLOB中摄取?

另一个相关的解决方案是编写一个Transformer(如上面的Kogel)将byte []转换为字符串(来自DataImportHandler FAQ)。使用真正的二进制文档,这将把垃圾送入索引,而不是像Tika那样正确地提取文本元素。不行。

最终的相关解决方案是RichDocumentHandler提供的UpdateRichDocuments。这已被弃用,在Solr中不再可用。该页面引用了ExtractingRequestHandler(如上所述)。

似乎正确的解决方案是使用DataImportHandler和使用Tika类的客户Transformer。这是如何工作的?

2 个答案:

答案 0 :(得分:6)

许多小时后......首先,关于这个问题有很多误导,错误和无用的信息。没有页面似乎在一个地方提供一切。所有的信息都是出于好意,但是在不同的版本之间,而有些版本在我脑海中,它并没有解决问题。这是我收集的所学内容和解决方案。 重申一下,我正在使用Solr 4.0(在Tomcat上)+ Oracle 11g。

解决方案概述:DataImportHandler + TikaEntityProcessor + FieldStreamDataSource

第1步,请确保更新solrconfig.xml,以便solr可以找到TikaEntityProcessor + DataImportHandler + Solr Cell内容。

<lib dir="../contrib/dataimporthandler/lib" regex=".*\.jar" />
<!-- will include extras (where TikaEntPro is) and regular DIH -->
<lib dir="../dist/" regex="apache-solr-dataimporthandler-.*\.jar" />
<lib dir="../contrib/extraction/lib" regex=".*\.jar" />
<lib dir="../dist/" regex="apache-solr-cell-\d.*\.jar" />

第2步,修改您的data-config.xml以包含您的BLOB表。这是我遇到的最麻烦的地方,因为随着版本的变化,这个问题的解决方案已经发生了很多变化。另外,使用多个数据源并将它们正确地插在一起对我来说并不直观。一旦它完成,它非常光滑。确保替换您的IP,SID名称,用户名,密码,表名等。

<dataConfig>
  <dataSource name="dastream" type="FieldStreamDataSource" />
  <dataSource name="db" type="JdbcDataSource"
    driver="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@192.1.1.1:1521:sid"
    user="username"
    password="password"/>
  <document>
    <entity 
      name="attachments" 
      query="select * from schema.attachment_table"
      dataSource="db">
      <entity 
        name="attachment" 
        dataSource="dastream"
        processor="TikaEntityProcessor"
        url="blob_column"
        dataField="attachments.BLOB_COLUMN"
        format="text">
        <field column="text" name="body" />
      </entity>
    </entity>
    <entity name="unrelated" query="select * from another_table" dataSource="db">
    </entity>
  </document>
</dataConfig>

重要提示。如果在尝试导入时出现"No field available for name : whatever"错误,则FieldStreamDataSource无法解析您提供的数据字段名称。对我来说,我必须使用小写列名称的url属性,然后使用outside_entity_name.UPPERCASE_BLOB_COLUMN的dataField属性。此外,一旦我的列名称错误,也会导致问题。

第3步,您需要修改schema.xml以添加BLOB列字段(以及您需要索引/存储的任何其他列)。根据您的需要进行修改。

<field name="body" type="text_en" indexed="false" stored="false" />
<field name="attach_desc" type="text_general" indexed="true" stored="true" />

<field name="text" type="text_en" indexed="true" stored="false" multiValued="true" />
<field name="content" type="text_general" indexed="false" stored="true" multiValued="true" />

<copyField source="body" dest="text" />
<copyField source="body" dest="content" />

有了这个,您应该可以节省很多时间来获取二进制,富文本文档(也就是富文档),这些文档作为BLOB存储在使用Solr索引的数据库列中。

答案 1 :(得分:2)

Tika和DIH的整合已通过TikaEntityProcessor

提供给Solr

整合 - SOLR-1358
Blob处理 - SOLR-1737

你需要找到合适的组合。