以前,我已经使用 Tika & Solr 成功地索引了存储在 Oracle 的 BLOB 列中的富文档。但是,现在我试图用 PostgreSQL (9.5.1) 数据库和 Solr (5.5.0) 做同样的事情,但无法让它工作。我在 Google 上搜索了很多,但没有发现任何关于 BYTEA 列、Tika 和 Solr 的具体内容。
我怀疑我的数据源配置错误,但我尝试了每种数据源类型都没有成功。
在 PostgreSQL 数据库中,我有一个名为“附件”的表,其中有一列名为“媒体”的 BYTEA 类型。列中存储有丰富的文档(例如,Word 文档、JPG、RTF 等)。
这是 data-config.xml 的相关部分。
<dataSource name="f1" type="FieldStreamDataSource"/>
<dataSource name="db" type="JdbcDataSource" driver="org.postgresql.Driver"
url="jdbc:postgresql://<ip_address>/<db_name>"
user="<username>" password="<password>"/>
<document>
<entity name="attachment" dataSource="db" query="select * from attachment">
<entity name="blob" dataSource="f1" processor="TikaEntityProcessor" url="media" dataField="attachment.MEDIA" format="text" onError="continue">
<field column="text" name="body" />
</entity>
</entity>
</document>
在我的 solrconfig.xml 中,我包含了所有正确的库,因为它不会抱怨这一点。
在托管模式文件中,我有这个部分。
<field name="body" type="text_general" indexed="true" stored="true"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
</analyzer>
</fieldType>
Solr 将开始正常。我去执行数据导入和 Solr 报告:
Indexing completed. Added/Updated: 226 documents. Deleted 0 documents. (Duration 02s)
Requests: 1(2/s), Fetched: 226(113/s), Skipped: 0, Processed: 226(113/s)
但是,索引中没有与富文档关联的文本。当我转到 Logging 标签时,我看到了这些错误(附件表的每一行都有一个错误)。
Thursday, March 02, 2017 3:17:45 PM ERROR null EntityProcessorWrapper Exception in entity : blob:java.lang.RuntimeException: unsupported type : class java.lang.String
我尝试更改 data-config.xml 以使 f1 数据源的类型为 FieldReaderDataSource:
但是,我仍然遇到错误。这是我在 FieldReaderDataSource 中看到的错误(附件表中的每一行都有一个)。
Thursday, March 02, 2017 4:09:19 PM ERROR null EntityProcessorWrapper Exception in entity : blob:java.lang.ClassCastException: java.io.StringReader cannot be cast to java.io.InputStream
任何想法我做错了什么?