Elasticsearch倒排索引-个人总结

技术主题

在实际业务场景中,主要的核心数据库还是mysql,但是涉及到搜索的场景时候,这时候mysql的弊端就显示出来了,众所周知mysql的索引的底层结构是b+树,在词文搜索的时候不满足快速进行搜索匹配。为了弥补这一个缺点,业界内普遍使用Elasticsearch搜索引擎来实现,分词搜索,从而在上亿的数据中,快速检索出客户需要的内容。

技术原理

Elasticsearch的倒排索引

1)数据库的倒排索引,宏观上来讲就是对于一个键值对key-value,这一点和redis类似,es是通过value去寻找key,和正常的mysql逻辑不一样,mysql的B+索引是通过主键id去查询对应的value。

2)对于mysql的搜索关键词,普通的逻辑通过like查询,例如下面的语句:

select * from book where book_content like '%aa%';

可想而知存在的弊端就是无法使用数据库索引,需要全表扫描,性能差,搜索效果差,无法得到文档与搜索条件的相关性

3)es的整体交互数据图如下:
在这里插入图片描述

4)倒排索引结构:
在这里插入图片描述

整个倒排索引由两部分组成,一部分是单词词典,也就是分词后的词典,另一部分是倒排列表,倒排列表里面包含的是文档id、词频、位置等多个信息,数据之间本身是独立的,Lucene将倒排列表拆分成三个文件存储:doc后缀文件:记录 Postings 的 docId 信息和 Term 的词频;pay后缀文件:记录 Payload 信息和偏移量信息;pos后缀文件:记录位置信息

5)单词词典的内部有两种数据结构实现:B+树和hash表
在这里插入图片描述

倒排索引的另一部分是Term Dictionary :Terms Dictionary(索引表)存储所有的 Term 数据,同时它也是 Term 与 Postings 的关系纽带,存储了每个 Term 和其对应的 Postings 文件位置指针。
在这里插入图片描述

6)倒排索引的搜索过程如下,内部的搜索过程如下:
在这里插入图片描述
在整个搜索过程中,首先会将搜索的文本进行分词,查询用户的分词结果是否在单词词典中,如果不在搜索结束,没有搜到内容,如果分词存在于单词词典,

7)倒排索引的倒排列表存储如下:

例如下面的文档:
文档1:今年的年度目标
文档2:第二个年度的目标
DocID:出现某单词的文档ID
TF(Term Frequency):单词在该文档中出现的次数
POS:单词在文档中的位置
对于目标这个单词,目标在文档1出现的次数是1,单词的位置3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhiguoXue_IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值