4

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

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

由于 Kogel 的解决方案似乎走在了正确的道路上,有没有办法在自定义 Transformer 中使用 Solr 包含的 Tika 类?这将允许所有 Tika 功能与 Kogel 优雅的数据库解决方案一起使用。

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

另一个相关的解决方案是编写一个 Transformer(就像上面的 Kogel 一样)将一个 byte[] 转换为一个字符串(来自 DataImportHandler FAQ)。对于真正的二进制文档,这会将垃圾信息输入索引,而不会像 Tika 那样正确提取文本元素。不会工作。

最后一个相关的解决方案是 RichDocumentHandler 提供的 UpdateRichDocuments。这已被弃用,并且在 Solr 中不再可用。该页面将您引向 ExtractingRequestHandler(如上所述)。

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

4

2 回答 2

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带有小写列名的属性,然后是dataField带有 outside_entity_name.UPPERCASE_BLOB_COLUMN 的属性。此外,一旦我的列名错误,这也会导致问题。

第 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 索引的数据库列中。

于 2013-03-02T03:14:20.330 回答
2

Solr 已经通过TikaEntityProcessor提供了 Tika 和 DIH 的集成

集成 - SOLR-1358
斑点处理 - SOLR-1737

你只需要找到正确的组合。

于 2013-03-01T03:46:33.213 回答