一 .倒排索引(Inverted Index) ElasticSearch引擎把文档数据写入到倒排索引(Inverted Index)的数据结构中,倒排索引建立的是分词(Term)和文档(Document)之间的映射关系,在倒排索引中,数据是面向词(Term)而不是面向文档的。
一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表 示例: 对以下三个文档去除停用词后构造倒排索引
倒排索引查询过程查询包含“搜索引擎”的文档
通过倒排索引获得“搜索引擎”对应的文档id列表,有1,3通过正排索引查询1和3的完整内容返回最终结果倒排索引-组成
单词词典(Term Dictionary)倒排列表(Posting List)单词词典的实现一般用B+树
倒排列表(Posting List)
倒排列表记录了单词对应的文档集合,有倒排索引项(Posting)组成 倒排索引项主要包含如下信息: 1.文档id用于获取原始信息 2.单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续相关性算分 3.位置(Posting),记录单词在文档中的分词位置(多个),用于做词语搜索(Phrase Query) 4.偏移(Offset),记录单词在文档的开始和结束位置,用于高亮显示
B+树内部结点存索引,叶子结点存数据,这里的 单词词典就是B+树索引,倒排列表就是数据,整合在一起后如下所示
ES存储的是一个JSON格式的文档,其中包含多个字段,每个字段会有自己的倒排索引
倒排索引的结构
包含这个关键词的document list 包含这个关键词的所有document的数量:IDF(inverse document frequency) 这个关键词在每个document中出现的次数:TF(term frequency) 这个关键词在这个document中的次序 每个document的长度:length norm 包含这个关键词的所有document的平均长度 倒排索引不可变的好处
不需要锁,提升并发能力,避免锁的问题 数据不变,一直保存在os cache中,只要cache内存足够 filter cache一直驻留在内存,因为数据不变 可以压缩,节省cpu和io开销