lucene概念:
lucene被定义为开源的全文检索引擎包。其主要功能就是提供索引和搜索两大模块的API。
关于lucene的整个架构(图是借用的):
下面这个架构图其实揭示的就是lucene的两大基础:索引和搜索
下面这个图其实说的是lucene的几大模块(其实也就是几大流程):分析,索引,查询解析,检索,相关性分析
个人认为要深入理解lucene,首先得理解两个大的基础,一是索引的基础,即索引文件格式(当然还包括索引的);二是搜索的基础,即搜索算法评分原则。接下来的文章首先会讲这两点,虽然比较枯燥,但是个人认为对于理解索引和搜索有相当重要的作用。
本文使用最新的lucene4.5版本。关于现在网上大量之前的版本,我也会尽量说明之前版本的问题,以及4.5如何使用替代方案的。
既然是概述,我们先来回顾一下lucene发展至今的一些能力:
1. 索引和搜索能力。从lucene的各个版本的更新历史来看,lucene的索引和搜索速度从1.0到现在有了多次的提升,比如1.4.1,2.2,2.3,2.4,内存和磁盘占用更小。
官方的数据是:在现代的计算机上索引速度可以到150G/小时,并且只需要1M内存(这个还得看怎么用的吧),由于使用了压缩技术,索引大小仅为文本的20%到30%
2. 多种索引存放方式,增量索引,近实时搜索。增量索引使得索引在第一次建好之后需要维护索引时可以基于第一次的基础维护,而不是每次都只能重建,增量索引可以大大的减少维护成本。近实时搜索是lucene2.9引入的一项重要功能,即文档的即时索引和即时搜索。在2.9以前,建立索引到提交(commit)索引之间有可能会有很长时间的间隔,这段间隔的内容是无法被索引到的,而2.9以后能够在查询的时候实时刷新缓冲区中新增或者删除的文档。
3. 过滤,排序,高亮,丰富的查询类型可以处理各种查询case。排序是实际业务中一项重要的能力,1.4以后开始提供这项能力,默认情况下,lucene通过关联性评分对匹配文档进行降序排序,关联性最好的在最前面,但是可以根据需要来定制类似淘宝的商品排序能力。另外,lucene提供phrase queries, wildcard queries, proximity queries, range queries等等来处理各种查询的情况。
4. 跨度查询等技术。跨度查询提供的是位置感知能力。比如一段文本中单查询奥巴马和叙利亚,可能查到的是奥巴马演讲,叙利亚局势,是两个不相干的信息。但是如果查询所有靠近奥巴马并且包含叙利亚的文本,可能查出来的就是奥巴马向叙利亚宣战。这个能力可以让我们的查询更加精确。
5. 灵活的评分机制。4.0以前,评分算法都是空间向量模型,难于扩展,而且没有统计到Field。4.0以后,增加了灵活的评分机制,可以支持各种类型的评分模型,比如,基于概率的BM-25,语言模型,随机分歧,基于信息量的模型。根据不同的需要可以定制。
6. 利用codec解耦lucene的索引与架构。解耦的好处不言而喻,可以让lucene支持