凤凰山笔记

使用solr4.0+tika索引文件夹下所有文件

配合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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<dataConfig>  
<dataSource type="BinFileDataSource" />
<document>
<entity name="files" dataSource="null" rootEntity="false"
processor="FileListEntityProcessor"
baseDir="c:/temp/docs" fileName=".*\.(doc)|(pdf)|(docx)"
onError="skip"
recursive="true">
<field column="fileAbsolutePath" name="id" />
<field column="fileSize" name="size" />
<field column="fileLastModified" name="lastModified" />

<entity
name="documentImport"
processor="TikaEntityProcessor"
url="${files.fileAbsolutePath}"
format="text">
<field column="file" name="fileName"/>
<field column="Author" name="author" meta="true"/>
<field column="title" name="title" meta="true"/>
<field column="text" name="text"/>

</entity>
</entity>
</document>
</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
2
3
4
5
6
7
8
9
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="fileName" type="string" indexed="true" stored="true" />
<field name="author" type="string" indexed="true" stored="true" />
<field name="title" type="string" indexed="true" stored="true" />

<field name="size" type="plong" indexed="true" stored="true" />
<field name="lastModified" type="pdate" indexed="true" stored="true" />

<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>

这样你通过solr4.0自带的UI中进行dataimport即可,具体搜索测试这里不作赘述。

cloudroc wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
很惭愧,只做了些微小的工作,您的支持将鼓励我继续努力创作!