Apache Lucene项目是一个完全用Java编写的高性能、全功能的文本搜索引擎库,最近它发布了2.9版。此次发布在2.4.1版的基础上进行了许多增强:
* 单个Segment的查询及缓存,这使reopen操作的速度显著提高。
* 为IndexWriter增加了接近实时的搜索功能。
* 新的Query类型。
* 更智能,伸缩性更强的多词(multi-term)查询(如Wildcard,Range等等)。
* 最新优化过的Collector/Scorer API。
* 新增的Unicode支持及字符集(Collation)。
* 基于Attribute的TokenStream新API。
* 在contrib中提供了新的QueryParser框架,并替换了核心实现。
* 在基于字段搜索,或使用自定义的Collector的时候可取消Score功能,这样可以获得显著的性能提高。
* 新的分析器(PesianAnalyzer,ArabicAnalyzer即SmartChineseAnalyzer)。
* 为大型文本新增快速向量高亮工具(fast-vector-highlighter)。
* 对数字字段提供了高性能的查询支持。这些字段使用前缀树的结构进行索引,能直接支持简单而高效的数字范围查询,而不需要在外部对数字进行处理。
虽然Lucene团队打算在小版本的更新上做到完整的兼容,但是Lucene 2.9在不少方面破坏了这一点。
下面是我使用过程中遇到的一些问题和解决方案:
1、添加索引
最新2.9的IndexWriter 建立方式:
IndexWriter 参数调整
把其他格式转化为lucene需要的Document格式
向IndexWriter添加doc,可以插入多条doc
开始写入(close的时候为实际写入过程)
读取写入的索引数
在close之前可以进行优化(不建议在建立索引时候使用)
writer.optimize()
2、清空索引
3、删除指定索引(和清空差不多)
4、更新索引
就是先删除再添加的过程,没有直接update的办法
5、读取建立的索引分词
6、搜索
最新2.9的IndexSearcher 建立方式:
创建查询条件(这里建一个最复杂的,根据多个限定条件查找,并且有的限定条件放在多个field中查找,有精确限定和范围限定)
排序情况
2.9最新查询方式,只是获取id
加入分页
循环解析docList中的Document获取所需要的值
doc.get("title");
...
7、关于分词
注意建立索引和搜索时候的analyzer必须一致,而且建立索引和搜索时候目录也要保持一致
lucene自带的一些分词器
StandardAnalyzer() 会按空格和标点符号划分
WhitespaceAnalyzer() 会按空格划分
中文分词这里使用的是paoding的中文分词
是先按词库划分,当词库中不存在时按二分法进行划分
8、其他待补充