lucene 在eclipse plugin 开发中的使用

使用lucene的原因:

一个月前开发平台(其它项目组用其来开发,其实就是eclipse 插件,姑且这么叫吧,装一下,呵呵),要提供搜索编辑添加的解析文件的功能,之后做成一个下拉菜单出来。当时想着一个是db 来实现一个就是用ir了。db没什么好说的。想着如果用eclipse还要依赖个orcacle 或者mysql 真是太好笑了。用嵌入式db 如db4j,hsqldb还有java自带的java db(dirby)也不是不行。不过觉得关系数据库在用它没什么意思,其次把这些作为lib 加入模块,显得太重了。那毫不犹豫选了lucene,lucene 有自己的好处,第一eclipse 3.7自带lucene 2.9 和lucene 1.9,已经是module了。第二jdt 自身的搜索也是基于建立索引的,而不是像关系数据库。所以最终选了lucene。

关于lucene,lucene使用很简单,出奇的简单(推荐lucene in action)。第二lucene的实现大体分两部分,建立索引和搜索。这个和jdt 的搜索机制是一样的。当然写jdt 的一干大牛自然不会假他人之手,所有实现都是自己做的。不然也不会把search 作为自己存在的三大支柱之一了。lucene 的数据组织结构分为field,document,index,field 可对应rmdb的field,document可对应db的record,lucene 的index 可以对应于db的表,也可以对应为库,这是为什么呢?因为lucene 是没有schema的,那么就没有必要分表,(你可以想象一下如果db 没有shema的限制,所有表内数据都可以放入到一个表了)

之后设计也不难,首先是一个resource listener监听资源变化,在addlistener 打开一个index 线程,listener 监听到对应资源变化,通过blocking qunue 通知index 线程(不过要检查一下线程是否是running的,如果不是重新打开),线程从队列里拿信息,建立索引。之后就是搜索了。这些都没什么了。

遇到两个问题:

一开始我用project 和文件路径做”主键“field,来进行删除操作,结构删不掉,我以为是lucene 只是标记,不真正删除的问题,加了optimize(),结果还是不行,原来是我只把那个field  store了,没有进行索引(没有查询的必要,就没加),结果导致deleteDocument 不能删除。

第二个,是在重建索引的时候,先把索引文件删除,在重新索引,结果一开始是lock 文件锁住,强行unlock掉,反正重建,缓冲区有数据也不要紧。之后还是不行,-0.cfs 始终没关掉,我在关闭索引的代码里,能释放的都释放了,indexWriter,directory,indexReader .... 能关的都关,结果还是不行。最后,只能用deleteAll 来清除了。

最后觉得所谓的搜索引擎也不是很高深的东西,比db 还简单点,貌似,虽然有queryparse 单那比sql 简单多了。简单用用还是没什么的。但是用户量大了,那就另一回事了吧。

猜你喜欢

转载自zxy1123.iteye.com/blog/2055629
今日推荐