我已经找到了一些与此问题相关的解决方案。我会解释,相关的解决方案对我不起作用。 (我正在使用Solr 4.0并为存储在Oracle 11g数据库中的数据建立索引。)

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

由于Kogel的解决方案似乎走在正确的道路上,是否有办法在自定义的Transformer中使用Solr随附的Tika类?这将使Kogel优雅的数据库解决方案具有所有的Tika功能。

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

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

最终相关的解决方案是RichDocumentHandler提供的UpdateRichDocuments。不建议使用此方法,在Solr中不再可用。该页面将您引向ExtractingRequestHandler(如上所述)。

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

最佳答案

许多小时后...首先,关于此问题有很多误导,错误和无用的信息。没有页面似乎可以在一处提供所有内容。所有的信息都是精心设计的,但是在不同的版本之间,甚至有些让我烦恼,这并不能解决问题。这是我所学到的知识和解决方案的集合。重申一下,我正在使用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索引的数据库列中。

10-06 13:47
查看更多