发布时间:2023-04-11 19:00
目录
ES——elasticsearch
全文检索引入ES——倒排索引
应用场景:海量数据情况下的搜索。
什么是索引?索引的本质
空间换时间
帮助快速检索
以数据结构为载体(mysql以b+树为数据结构)
以文件的形式落地
为什么es比mysql适合做搜索?
mysql在超过百万千万数据量的情况下,搜索性能堪忧
mysql的索引数据结构:B+树,当层级越来越深的时候,性能也会下降。
单个node节点的体积越小,一层相对来说可以装更多个节点。
当以ID为索引的时候,确实如此。但是如果以文本(类似于文章的内容详情content)作为索引,它的大小必不可能小。性能也就下去了。
倒排索引的建立过程:
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 (再切分)