我正在使用Solr和DataimportHandler来索引丰富的文档,如pdf,word,image等 我正在使用TikaEntityProcessor从文件中提取内容。
我有一个关于将值设置为'url'条目的小问题。
我的data-config.xml文件是这样的:
<dataConfig>
<dataSource name="db_ds" type="JdbcDataSource"
driver="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@KOR308051.bmh.apac.bosch.com:1521:xe"
user="ezbdb"
password="ezbdb"/>
<dataSource name="tk_ds" type="BinFileDataSource" />
<script>
<![CDATA[
function getFilePath(row) {
var link = row.get('url_link');
if (link === null || true === link.isEmpty() || link === '') {
row.remove('url_link');
} else {
var path_arr = link.split("#");
var file_path = path_arr[0];
row.put(file_path);
}
return row;
}
]]>
</script>
<document name="db_doc">
<entity name="db_link"
query="SELECT
d.doc_url as Link,
d.doc_name as Name,
cast(trunc(d.last_modified) as date) as Last_modified
FROM doc_data d
dataSource="db_ds" transformer="DateFormatTransformer,script:getFilePath">
<field column="LINK" name="link"/>
<field column="NAME" name="name"/>
<field column="LAST_MODIFIED" name="last_modified" xpath="/RDF/item/date" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
<entity name="tika-doc" dataSource="tk_ds" processor="TikaEntityProcessor"
url="${db_link.LINK}" format="text" onError="skip">
<field column="text" name="content"/>
</entity>
</entity>
</document>
</dataConfig>
问题是,文件路径以不同的模式存储在数据库中: “doc_url”是db中存储url或文件路径的字段。文件路径以这种方式存储: d:\游戏\ CS2 \ setup.doc#d:\游戏\ CS2 \ setup.doc#的 即,路径被存储两次由'#'分隔。我不确定为什么要这样做。它已由我们的客户完成。
我只需要一个文件路径,即D:\ Games \ CS2 \ setup.doc
我将网址值传递给tika为 url="${db_link.LINK}"
但 ${db_link.LINK}
包含直接来自数据库的路径。
我已经尝试使用脚本转换器并使用'#'将路径字符串拆分为部分,并使用 getFilePath(row)
方法获取第一个路径,但没有运气。
我仍在获取存储在db中的路径。这在尝试索引时会出现 FileNotFound 异常,这很明显,因为路径不正确。
可以做些什么才能获得路径,而忽略了路径的剩余部分#和所有?
非常感谢帮助:)
答案 0 :(得分:1)
您可以使用SolR的RegexTransformer:
http://wiki.apache.org/solr/DataImportHandler#RegexTransformer
<entity name="db_link" query="SELECT ..." ... transformer="... ,org.apache.solr.handler.dataimport.RegexTransformer"...>
<field column="link" regex="^([^#]+)#" sourceColName="LINK"/>
那应该是全部
编辑正则表达式已更正