当前位置: 首页 > news >正文

Elasticsearch从入门到进阶——搜索优化原理

目录

1 倒排索引的缺点

2 倒排表优化

2.1 FOR数据压缩算法

2.1.1 差值存储

2.1.2 动态分组

2.2 RBM数据压缩算法

2.2.1 核心思想

2.2.2 容器

3 索引优化

3.1 关键词排序

3.2 字典树(Trie 树)

3.3 FST有限状态转换器


前言:

        在上篇文章,我们了解了搜索引擎的核心结构就是正排索引和倒排索引,并实现了简单的搜索引擎。但是Elasticsearch基于lucene实现的搜索引擎还有许多设计细节,这篇文章就来了解一下:

Elasticsearch从入门到进阶——搜索引擎原理https://blog.csdn.net/sniper_fandc/article/details/153780500?fromshare=blogdetail&sharetype=blogdetail&sharerId=153780500&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

1 倒排索引的缺点

        倒排索引通常被持久化到磁盘存储,但是为了提高搜索效率,我们需要将倒排索引加载到内存中。按照目前的倒排索引实现,存在几个缺点:

        (1)倒排索引的倒排表记录了文档id,如果一个词在大量文档中都出现,就会导致文档id列表非常大,把倒排索引加载到内存中,就会占用极高的内存空间。

        (2)倒排索引查询词时,如果仅依靠遍历所有的词,查询效率也是比较低的。

        根据这两个缺点,就有了两种优化方向,基于倒排表的优化,解决缺点1。基于索引的优化,解决缺点2。

2 倒排表优化

2.1 FOR数据压缩算法

        假设倒排表存储的文档id列表为[50,205,206,210,224],文档id类型为int型(占用4字节),那么存储这个文档id列表需要4字节*5=20字节。如果某个词有100w个文档id,那存这一个词都需要100w*4字节=400w字节,这约等于3.81MB。常规32GB内存也就能存8600个词的倒排表,因此要考虑数据压缩。

        FOR数据压缩算法(Frame Of Reference)是采用差值存储+动态分组的思想实现存储空间的优化:

2.1.1 差值存储

        差值存储是指FOR算法不再存储每个数,而是存储数与数之间的差值,因为差值通常比原数要小。

        具体实现是每个数据都表示与前一个数据之间的差值,比如上图的155=205-50得到,1=206-205得到。

        差值存储后,原文档id列表[50,205,206,210,224]变为[50,155,1,4,14],其中最大的数是155,需要8个比特位存储,那么其它的数据肯定用8bit也能存储,也就是1字节就能存储每一个差值了。

        共计1字节*5=5字节空间,空间大幅减少。

2.1.2 动态分组

        由于用最大数存储其它小的差值比较浪费空间,比如用8bit存储差值1,实际仅需1bit就可以实现,因此FOR算法还采用动态分组策略,将大差值和小差值分组,大差值组用统一的大小存储,小差值用统一的大小存储,从而减少了小差值浪费的空间。

        比如[50,155,1,4,14]可以划分为[50,155]和[1,4,14],[50,155]用2个8bit存储=2字节,[1,4,14]用3个4bit存储(14最大,用4bit足够)=12bit=1.5字节。

        共计2+1.5=3.5字节,空间进一步减少。

        注意:上述采用动态分组还需要额外存储分组的信息(如每组边界:用来区分组的划分、比特位数:差值所占的实际位数)便于数据解压,但是这对于核心数据占用的空间来讲微不足道,故没有考虑。

        分组越多,小差值压缩率越高,但需额外存储组信息。FOR算法自动计算分组后的总成本(数据+元数据(分组的信息)),选择整体空间最小的方案,避免过度分组导致元数据膨胀。

2.2 RBM数据压缩算法

        FOR算法适合存储数据稠密,一旦数据稀疏,就会导致差值平均,从而动态分组缩减的空间变少。对于这样的数据特征,更适合RBM数据压缩算法(RoaringBitmap):

2.2.1 核心思想

        RBM算法主要思想是除法,文档id列表除以2^16得到商和余数,数据的二进制表示的高16位即为商,低16位即为余数。

        商存储到桶中,余数存储到桶对应的容器中。由于商会出现重复,因此可以重复使用,即用商做索引,通过桶+余数定位唯一的数据。上图展示的是ArrayContainer容器,即容器以数组方式组织,每个元素都是桶对应余数。

2.2.2 容器

        容器的类型有如下三种:

(1)ArrayContainer

        上述已经讲过,不再赘述。

(2)BitmapContainer

        即容器以位图方式组织,每个余数在位图中对应2进制占一位,余数范围是0-65535,即需要2^16bit位的位图,位图大小为8KB。

(3)RunContainer

        连续的余数适合用RunContainer,比如数据范围为[1000-9999],每个数据与前一个数据都差1(这样的数据区间成为连续区间)。此时可以记录连续区间起始和长度(行程长度编码),比如(1000,8999)。占用空间大小为2*N字节,N表示连续区间的个数,2表示一个连续区间的形成长度编码为16bit即2字节。

        三种容器的选择情况:

        当元素的个数>4096时,此时用ArrayContainer存储会占用>2字节*4096=8192字节=8KB,此时用ArrayContainer存储占用的空间就会超过BitmapContainer。因此以元素个数=4096为阈值,超过该阈值更适合BitmapContainer;未超过更适合用ArrayContainer

3 索引优化

3.1 关键词排序

        查询倒排索引的词条字典(Term Dictionary)时,如果采用遍历的方式,时间复杂度就是O(n)。可以将词条字典的词进行字符串排序,然后使用二分查找,时间复杂度就是O(logn).

3.2 字典树(Trie 树)

        倒排索引从磁盘载入到内存中,对于内存的压力还是比较大。观察排序后的词条字典发现,连续排列的词与词之间可能存在公共前缀,公共前缀占用的空间就少很多。因此可以结合树的结构,采用类似B+树等思想,加速查询,减少空间占用。

        如下的倒排索引:

词条字典文档id
common[1,2,3]
committee[2,3]
computer[1,2,4]

        就可以构建字典树(又称为前缀树、Trie树):

        将共享前缀加载到内存中,再记录词在磁盘中的偏移量,在内存中搜索共享前缀,然后去对应磁盘偏移量进行二分查找,就进一步优化了搜索性能。

3.3 FST有限状态转换器

        进一步发现,上述字典树除了公共前缀外,还存在公共路径,因此可以进一步优化字典树,词与词之间共享公共路径,从而结构变为如下:

        这样的树型结构又被称为FST(Finite State Transducer)有限状态转换器。即为倒排索引的Term Index。

        本文所描述的总结在一起就是Elasticsearch的lucene搜索引擎对于倒排索引的优化,数据压缩算法是从空间角度优化倒排表的存储空间,而Term Index是从以空间换时间的角度优化词的搜索效率(从内存角度讲也是优化了内存的空间使用)。

http://www.dtcms.com/a/524844.html

相关文章:

  • 农田、果园与灌区气象监测的技术应用与实践价值
  • php做网站好吗wordpress博客非插件
  • 继承(2),咕咕咕!
  • C++编程技巧和规范_9_引用计数解析
  • android11禁止安装apk
  • 深入了解linux网络—— 自定义协议(下)
  • 金麦建站官网成都视频剪辑培训
  • 【C++闯关笔记】详解多态
  • 数据库技术指南(二):MySQL CURD 与高级查询实战
  • 用mvc做网站报告做做做网站
  • 设置一个自定义名称的密钥,用于 git 仓库上下传使用
  • MAC Flood与ARP Flood攻击区别详解
  • 高兼容与超低延迟:互联网直播点播平台EasyDSS直播服务如何成为直播点播应用的“技术底座”?
  • MongoDB 集群优化实战指南
  • wordpress网站速度检测医院做网站需要多少钱
  • iOS 26 查看电池容量与健康状态 多工具组合的工程实践
  • 机器学习(10)L1 与 L2 正则化详解
  • 保险网站建设平台与别人相比自己网站建设优势
  • vscode中好用的插件
  • PCB过电流能力
  • 【数据库】KingbaseES数据库:首个多院区异构多活容灾架构,浙人医创新开新篇
  • 嵌入式软件算法之PID闭环控制原理
  • 性价比高seo网站优化免费下载模板的网站有哪些
  • 无棣网站制作襄樊网站制作公司
  • AI服务器工作之电源测试
  • 《Muduo网络库:实现Acceptor类》
  • 第十三篇《TCP的可靠性:三次握手与四次挥手全解析》
  • SSE 流式响应实战:如何在 JavaScript 中处理 DeepSeek 流式 API
  • 在线阅读网站开发教程品牌建设促进会是什么工作
  • 一站式服务门户网站充值支付宝收款怎么做