Elasticsearch倒排索引原理

109 阅读2分钟

Elasticsearch在面临海量数据的搜索,或者有一些复杂搜索需求的时候,查询效率非常高效,这得益于其底层的倒排索引技术,那什么是倒排索引?

介绍倒排索引之前需要先说明一下什么是正向索引。我们在查询数据库时,既可以根据索引查询,也可以根据其他字段进行模糊查询。因为数据库结构B+树的关系,根据索引查询自然很快,但是进行模糊查询的时候,因为数据都存储在叶子节点上,查询时需要遍历每一个节点才能查询完整,效率非常低下。为了解决该问题,我们引入了倒排索引。

倒排索引是对正向索引的一种特殊处理和应用,创建倒排索引的流程如下:

  1. 将每一个文档的数据利用分词算法【例如IK分词器】根据语义拆分,得到一个个词条;
  2. 创建表,每行数据包括词条、词条所在文档id、位置等信息;
  3. 因为词条唯一性,可以给词条创建正向索引。

此时形成的这张以词条为索引的表,就是倒排索引表。因为其独特的表结构,Elasticsearch的查询方式也与数据库的正向索引查询有所区别:

  1. 先把文档内容进行分词,形成词条与文档ID的对应关系,叫做词条库,词条具备唯一性,建立索引;
  2. 对搜索内容进行分词,把分词后得到一个关键词列表,根据关键词去词条库中匹配,再找到对应的文档ID列;
  3. 然后根据文档ID列表,找到对应的文档信息。

由此我们可以知道正向索引和倒排索引的根本区别在于:正向索引先找到文档,再确认文档里是否包含所需词条,是根据文档找词条的过程;而倒排索引先找到词条,再根据词条对应的ID找到对应的文档,是根据词条找文档的过程。

当然倒排索引也存在其他问题,比如只能给词条创建索引,而不是表中的字段,另外也不能根据字段进行排序等,因此通常需要结合正向索引使用来构成一个完整的搜索引擎系统。