再次学习ES--1--Lucene
感觉一次学习ES不够,当时只是学习了如何使用es,更多的是把es当做一个数据库黑盒,只是知道了如何用,确不成考虑过底层的原理,现在希望能补上
1 关于Apache Lucene简介
Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
2 lucene的总体架构
document --文档,数据载体,包含一个或多个字段
field--文档的一个片段,包含2部分,字段名和内容
term--词项:搜索时的单位,代表文本的某个词
token--词条:term在字段中的一次出现,包括term的文本、开始和结束的唯一和类型(分析阶段的概念)
*倒排索引 (inverted index)结构
将term映射到文档的数据结构,是面向词项而不是文档
倒排索引
上面的是笼统的概念,实际的索引会更为复杂,索引还会存储其他信息如词向量(存储一个字段的所有词条),字段的原始信息,文档删除标记等。但不需要掌握这些。
Segment--段
每个索引由多个段组成,索引是总的一个概念,每个段只会被创建一次但会被查询多次,因此在索引期间,段经创建就不会再被修改。所以文档被删除,删除信息会被单独保存在一个文件中,段本身并不改变。
segment merge-- 段合并
多个段合并,由Lucene内在机制决定在某个时刻执行,合并后段数量更少,但是单个段变大,消耗I/O,合并后会清楚一些不再使用的信息
3 分析数据 analysis
文档如何转换为倒排索引,查询如何转换为可用于搜索的词项,这个过程就是 分析
文本分析由分析器执行,分析器分为 分词器(tokenizer),过滤器(filter)和字符映射器(character mapping)组成
- tokenizer--将文本切割成词条,包括原始信息,如位置,长度等,结构输出为词条流
- filter--过滤、修改词条,如小写过滤器等
- character mapping--用于分词前的本文预处理,如HTML的文本去标签
4 查询语言
一个查询,通常被分割为 词项 和 操作符
词项会在查询分析过程中,根据设置进行处理
而操作符包含 布尔操作符(and |or| not),+,-,^(权重,默认为1)
- 查询的基本就是在字段中查询,Lucene所有的数据都存储在field中,查询提供字段名和查询的从句
lucene的数据存储数据结构,有待深入研究
5 lucene是如何进行多字段查询的
如果有多字段进行查询时,相当于要从2个term的 文档集合取交集,先了解拉链法(有序队列,从小到大比较),再了解用跳表优化拉链法,可以简化时间复杂度为(Olog(N))