首页 归档 关于 learn love 工具

Lucene基础工作流程

索引的生成分为两个部分:

  1. 创建阶段:
    • 添加文档阶段,通过IndexWriter调用addDocument方法生成正向索引文件;
    • 文档添加后,通过flush或merge操作生成倒排索引文件。
  2. 搜索阶段:
    • 用户通过查询语句向Lucene发送查询请求;
    • 通过IndexSearch下的IndexReader读取索引库内容,获取文档索引;
    • 得到搜索结果后,基于搜索算法对结果进行排序后返回。

索引创建及搜索流程如下图所示:

Lucene索引构成

正向索引

ucene的基础层次结构由索引、段、文档、域、词五个部分组成。正向索引的生成即为基于Lucene的基础层次结构一级一级处理文档并分解域存储词的过程。

索引文件层级关系如图1所示:

  • 索引(index):Lucene索引库包含了搜索文本的所有内容,可以通过文件或文件流的方式存储在不同的数据库或文件目录下。
  • 段(segment):一个索引中包含多个段,段与段之间相互独立。由于Lucene进行关键词检索时需要加载索引段进行下一步搜索,如果索引段较多会增加较大的I/O开销,减慢检索速度,因此写入时会通过段合并策略对不同的段进行合并。
  • 文档(document):Lucene会将文档写入段中,一个段中包含多个文档。
  • 域(field):一篇文档会包含多种不同的字段,不同的字段保存在不同的域中。
  • 词(tern):Lucene会通过分词器将域中的字符串通过词法分析和语言处理后拆分成词,Lucene通过这些关键词进行全文检索。

倒排索引

Lucene全文索引的核心是基于倒排索引实现的快速索引机制。

倒排索引原理如图2所示,倒排索引简单来说就是基于分析器将文本内容进行分词后,记录每个词出现在哪篇文章中,从而通过用户输入的搜索词查询出包含该词的文章。

问题:上述倒排索引使用时每次都需要将索引词加载到内存中,当文章数量较多,篇幅较长时,索引词可能会占用大量的存储空间,加载到内存后内存损耗较大。

解决方案:从Lucene4开始,Lucene采用了FST来减少索引词带来的空间消耗。
FST(Finite StateTransducers),中文名有限状态机转换器。其主要特点在于以下四点:

  • 查找词的时间复杂度为O(len(str));
  • 通过将前缀和后缀分开存储的方式,减少了存放词所需的空间;
  • 加载时仅将前缀放入内存索引,后缀词在磁盘中进行存放,减少了内存索引使用空间的损耗;
  • FST结构在对PrefixQuery、FuzzyQuery、RegexpQuery等查询条件查询时,查询效率高。

具体存储方式如图3所示:

倒排索引相关文件包含.tip、.tim和.doc这三个文件,其中:

tip:用于保存倒排索引Term的前缀,来快速定位.tim文件中属于这个Field的Term的位置,即上图中的aab、abd、bdc。
tim:保存了不同前缀对应的相应的Term及相应的倒排表信息,倒排表通过跳表实现快速查找,通过跳表能够跳过一些元素的方式对多条件查询交集、并集、差集之类的集合运算也提高了性能。
doc:包含了文档号及词频信息,根据倒排表中的内容返回该文件中保存的文本信息。

原文

https://segmentfault.com/a/1190000040371949