浅谈ES以及索引的本质

发布时间:2023-04-11 19:00

目录

ES——elasticsearch

全文检索引入ES——倒排索引


ES——elasticsearch

应用场景:海量数据情况下的搜索。

什么是索引?索引的本质

空间换时间

帮助快速检索

以数据结构为载体(mysql以b+树为数据结构)

以文件的形式落地

为什么es比mysql适合做搜索?

mysql在超过百万千万数据量的情况下,搜索性能堪忧

mysql的索引数据结构:B+树,当层级越来越深的时候,性能也会下降。

单个node节点的体积越小,一层相对来说可以装更多个节点。

当以ID为索引的时候,确实如此。但是如果以文本(类似于文章的内容详情content)作为索引,它的大小必不可能小。性能也就下去了。

全文检索引入ES——倒排索引

倒排索引的建立过程:

1切词:把一句话切成一个一个词

2规范化:类似于去掉am这样的无用词,do和Doing直接划分为Do

3去重:顾名思义

4字典序:排的是id,放的是int数组

倒排索引数据结构FST*

term index(加速) --  term dictionary(词项) – posting list(倒排表 ID int数组)

搜索引擎三个要点:快,准确(相关度),召回率

相关度(准确度)的计算两种算法: BM25和TF-IDF 相关度评分算法

召回率:返回数据的丰富性。随便搜索一点都能搜索出来

问题: posting list倒排表如果有特别多的id怎么办?怎么去做存储?

做压缩,而不是直接去使用Int数组存储。压缩算法两个:for和rbm算法

倒排索引的压缩算法(FOR RBM)

1.FOR压缩算法(Frame Of Reference )

考虑把每个数字,只存储和前一个的差值。采用自定义类型bit位来存储

例如说

[1,2,3….100w]  à [1,1,1,1,1…1]

存储空间: 100w*32bit=4MB -> 100w bit =0.125MB  压缩了32倍(最高压缩倍数)

当然上面这个是极端例子.看以下例子

[73,300,302,332,343,372] -> [73,227,2,30,11,29]

6*32bit=24Bytes  à 6*8bit= 1B+48bit =7Bytes (再切分)

  • [73,227] ,[2,30,11,29]  =1B+ 8bit*2 +1B+5bit*4=3B+4B=7Bytes

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号