上一篇,咱们介绍了 ES 文档的基本 CURE 和批量操做。咱们都知道倒排索引是搜索引擎很是重要的一种数据结构,什么是倒排索引,倒排索引的原理是什么。数据结构
1 索引过程app
在讲解倒排索引前,咱们先了解索引建立,下图是 Elasticsearch 中数据索引过程的流程。性能
从上图能够看到,文档未在 ES 中进行索引,而是 由 Analyzer 组件对其执行一些操做并将其拆分为 token/term。而后将这些术语做为倒排索引存储在磁盘中。假设咱们有两个名为 name 和 age 字段,当要将文档索引到 ES 时,Analyzers 组件 以某些定界符(有默认定界符,例如空格,句号等)将它们分割开获取 token,再对每一个 token 应用特定的过滤器。通过分析的这些标记称为 term。而后将这些 term 针对该字段)存储在倒排列表中。搜索引擎
2 倒排索引指针
2.1 正排与倒排索引code
通常在咱们阅读图书,咱们会根据目录快速定位想要阅读的章节,过了一段时间,你想要的回顾以前某一个知识点,你发现从目录难以查找到对应的地方,这时你可能就会从索引页从去查找对应内容索引,从而找到页码。blog
搜索引擎其实跟咱们的使用图书很类似,下面我来对图书和搜索引擎进行一个简单的类比,来看一下搜素引擎中正排和倒排索引。索引
2.2 倒排索引的核心组成token
举个例子,假设咱们有 3 个文档:文档
Doc 1:breakthrough drug for schizophrenia Doc 2:new schizophrenia drug Doc 3:new approach for treatment of schizophrenia
通过分析,文件中的术语以下
文档 | 分词结果 |
---|---|
Doc 1 | breakthrough,drug,for,schizophrenia |
Doc 2 | new,schizophrenia,drug |
Doc 3 | new,approach,for,treatment,of |
倒排列表的元数据结构:
(DocID;TF;<POS>)
其中:
DocID:出现某单词的文档ID
TF(词频):单词在该文档中出现的次数
POS:单词在文档中的位置
则它们生成的倒排索引
单词 | 逆向文档频率 | 倒排列表(DocID;TF;
|
---|---|---|
breakthrough | 1 | (1;1;<1>) |
drug | 2 | (1;1;<2>),(2;1;<3>) |
for | 2 | (1;1;<3>),(3;1;<3>) |
schizophrenia | 2 | (1;1;<4>),(2;1;<2>) |
new | 2 | (2;1;<1>),(3;1;<1>) |
approach | 1 | (3;1;<2>) |
treatment | 1 | (3;1;<4>) |
of | 1 | (3;1;<5>) |
ES 倒排索引包含两个部分
ES 也能够指定对某些字段不作索引
3 总结
在以前文章说了 ES 的文档是基于 JSON 格式,在咱们建立索引的时候,对每个文档记录对应索引相关的信息。在对倒排索引进行搜索时,查询单词是否在单词字典,获取单词在倒排列表的指针,获取有该单词单词的文档 Id 列表,经过 ES 的倒排索引,咱们轻易对全文进行快速搜素。