配合tika(一个开源的文档分析器,你就可以从各种格式的文件.doc,.pdf中提取文本),solr能够爬取和索引服务器文件夹下的所有文件,而且整合的成本很低。Apache tika是个独立的项目,你可以从这里找到所有tika的资料和它支持的文件格式,你可以直接将它用在你的java或者.net的项目之中。
首先你需要从Solr4.0的dist文件夹下复制所有你需要的jar包到你的core的lib目录下,我强烈建议你将contrib\extraction\lib下所有的文件复制到你的core下面,这样你可以随意使用solr自带的 Data Import Handler,并且避免缺少jar包的各种错误。
以下为一个文档导入的配置文件示例:
1 | <dataConfig> |
这是最简单的一个导入示例,但是有几个关键点你需要明白:
在我所有的schema.xml中都有一个名字叫id的field,它能帮助你唯一确认一个文件,然后它也能告诉solr你这个文件的索引是要被插入还是更新。然后就是用了一个叫做BinFiledataSource的数据源,这个东西可以很容易的抓取到文件夹下文档的一些标准值,如文档名称、最后修改日期,但是它并不能获取文档里面的文本内容。这个叫BinFiledataSource的数据源有个文档实例叫做“files”,并且有个rootEntity=”false”,这个原因是它并非真正的根节点实例,而根节点实例才是用来对文档进行索引的,其他的属性仅仅简单的说明哪个文件夹要去被抓取,文档的扩展名等,但是这些都可以被solr进行索引的。
所以我决定在实例中使用以下3个属性加入索引:
1.fileAbsolutePath: 这个可以用来作为文档的唯一索引
2.fileSize: 文档的大小
3.fileLastModified: 文档的最后修改时间
这三个字段之后有个叫做documentImport的实体,使用的处理器为TikaEntityProcessor,这个处理器可以帮助你抽取文档中的文本和metadata(作者、标题等这些属性),下面列一下我想存在索引里面的字段:
1.file:文件名称,与上面写的fileAbsolutePath不同
2.Autor、Title:都是文档的meta属性
3.text:文档的文本内容
当然不要忘了schema.xml也应该有这些字段的配置:
1 | <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> |
这样你通过solr4.0自带的UI中进行dataimport即可,具体搜索测试这里不作赘述。