我找到了一些解决这个问题的相关解决方案。我将解释相关的解决方案对我不起作用。 (我正在使用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。这是如何工作的?
答案 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)