Elasticsearch中的倒排索引和读写操作原理解析

本文深入解析Elasticsearch中的倒排索引原理,探讨为何其能支持高效模糊查询。倒排索引通过维护文档中出现的terms及它们的文档ID,实现了快速定位关键词。此外,文章还介绍了Elasticsearch的基本概念,如索引、类型、文档、节点、集群、分片,并解析了写操作和读操作的详细流程,涉及内存缓冲区、translog和段合并等关键环节。
摘要由CSDN通过智能技术生成

目录

前言

一、倒排索引

二、Elasticsearch中的基本概念

三、写操作原理

四、读操作原理


前言

在实际的生产环境中,起初启用Elasticsearch(下称ES)是为了解决模糊查询的问题。具体业务场景为大量抓取回来的短视频内容、热门微博、公众号文章、小红书笔记、信息流新闻文章等,需要支持用户模糊查找,而随着每日新增的内容越来越多,这些信息已经积累到单个媒体数千万近亿的数量,因此依靠MySQL的模糊查询是无法满足性能上的要求,考虑引入对应的搜索引擎来解决,于是就将数据的特定字段迁移至ES以支持快速高效的模糊查询,并将查询得到的ID取回MySQL匹配再将详细内容返回。

 

一、倒排索引

那么,为什么Elasticsearch能够支持高效的模糊查询?

事实上,为了支持模糊查询,用户输入关键词之后,需要快速定位到这些词对应的词条,思路与MySQL的LIKE一样,但是MySQL没有实现对应的方案以支持快速定位。而ES在这块上略有不同,利用倒排索引(Inverted Index)可以直接获取到文档的ID。

那么,为什么Elasticsearch是采用的倒排索引?

按照一般的索引检索信息的方式,比如原始的数据源假设都是以文档的形式被分开,文档1拥有一段内容,文档2也富含一段内容,文档3同样如此。然后给定一个关键词,要搜索出与此关键词相关的文档,自然而然我们联想到的办法就是一个个文档的内容去比较,判断是否含有此关键词,如果含有则返回这个文档的索引地址,如果不是接着用后面的文档去比,这就有点类似于字符串的匹配类似。 很显然,当数据量非常巨大的时候,这种方式并不适用。原来的这种方式可以理解为是索引-->关键词,而倒排索引的形式则是关键词--->索引位置,也就是说,给出一个关键词信息,我能立马根据倒排索引的信息得出他的位置。

事实上,每一个文档都会对应一个ID,而倒排索引会按照指定语法对每一个文档进行分词,然后维护一张表,列举所有文档中出现的terms以及它们出现的文档ID和出现频率。搜索时同样会对关键词进行同样的分词分析,然后查表得到结果。

如下图所示:

Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Term

Term Dictionary(单词字典):顾名思义,它里面维护的是Term,可以理解为Term的集合

Term Index(单词索引):为了更快的找到某个单词,我们为单词建立索引

Posting List(倒排列表):倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。(PS:实际的倒排列表中并不只是存了文档ID这么简单,还有一些其它的信息,比如:词频(Term出现的次数)、偏移量(offset)等,可以想象成是Python中的元组,或者Java中的对象)

举个栗子:
比如,有两篇文档内容如下,
D1:我是中国人,中国真好!
D2:我爱中国。
假设现在已经分了词,去了停词什么的(分词的结果不一定对,举个例子说明问题),则两篇文档的关键词如下:
AD1 :【我】【是】 【中国人】【中国】 【真】【好】
AD2 : 【我】【爱】【中国】
则倒排索引结构如下:

比如你要找"中国",首先会在索引里面找,找出含有“中国”的文档,然后对这两个文档分别计算和查询语句的相关度,按结果排序,然后返回呈现给用户。

这里所述倒排索引是针对非结构化的文档构造的,而在ES中存储的文档是基于JSON格式的,因此索引结构会更为复杂。简单来说,ES对于JSON文档中的每一个field都会构建一个对应的倒排索引。

那么,到底什么是倒排索引?
通过文档找词,比如我要在一篇文章中找“南京”,这个叫做正排。而通过词找含有这个词的文档,比如我想在某10篇文档中找哪些文档有“南京”这个词,这个叫做倒排。
倒排索引是一种数据结构,列出每个单词所在的文档和它们在每篇文档中出现的频次,优化的倒排索引一般还要包括单词在出现文档中的位置,这为搜索短语提供了可能。用户按关键词查询时,系统只需要在索引中找到该单词,就可以找到对应的文档。
比如,当用户输入查询关键词“迪奥 口红”时,系统可以通过倒排索引查找到所有包含“迪奥”和“口红”的文档,然后,对两个文档集合取交集得到同时出现“迪奥”和“口红”两个单词的文档,再根据位置信息,确定那些“迪奥”恰好出现在“口红”之前的文档,从而得到最终查询结果。

倒排索引构建的常用算法有两种:BSBI(基于磁盘的外部排序构建索引)算法和SPIMI(内存单遍扫描构建索引)算法,关于两种算法的原理和实现本文先不做阐述。

 

二、Elasticsearch中的基本概念

索引(Index)

ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值