【ES】ElasticSearch搜索的底层原理?倒排索引和TF-IDF打分算法

Elasticsearch搜索的底层原理

ES搜索是分词后,每个字可以利用FST高速找到倒排索引的位置,并迅速获取文档id列表,大大的提升了性能,减少磁盘IO。

ES的搜索原理就是倒排索引 + TF-IDF打分算法。

倒排索引及其结构

传统的正向索引是通过文章,逐个遍历找到对应关键词的位置。

倒排索引也叫反向索引,是通过词找到词在文档中的出现位置。

在这里插入图片描述

Term(单词):就是单词,或者叫分词。

Term Index(单词索引):Term Index存储某些单词的前缀,它在内存中以 有限状态转移器FST(Finite State Transducers)的数据结构保存的,可以更快的找到目标单词。

Term Dictionary(单词字典):维护了单词Term的集合。Term Dictionary的单词非常多,所以会对它们进行排序,查找的时候就可以通过二分查找来查,不需要遍历整个Term Dictionary。

Posting List(倒排列表):记录了出现过某单词的所有文档ID,和单词在这些文档中出现的位置信息,每条记录叫一个倒排项(Posting),根据倒排列表,可以知道哪些文档包含目标单词。PostingList会使用Frame Of Reference(FOR)编码技术对里边的数据进行压缩,节约磁盘空间。(PS:实际的倒排列表中并不只是存了文档ID这么简单,还有一些其它的信息,比如:词频(Term出现的次数)、偏移量(offset)等,可以想象成是Python中的元组,或者Java中的对象)

在这里插入图片描述

倒排索引的Term Index实现是基于:FST(Finite State Transducer)数据结构。FST有两个优点:
1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
2)查询速度快。O(len(str))的查询时间复杂度。

FST是将单词拆成单个字母存在节点上,每个节点存一个字母,根节点不存,从根节点出发到特定节点所经过的字母就可以组成目标单词,具体可以参考:
http://examples.mikemccandless.com/fst.py?terms=mop%2F0%0D%0Acat%2F1%0D%0Adog%2F2%0D%0Amemory%2F3%0D%0Amax%2F4&cmd=Build+it%21

FST基于字典树,可以参考:
https://blog.csdn.net/forever_dreams/article/details/81009580

TF-IDF打分算法

TF-IDF打分算法:
TF: 词频,每一个ID中包含的关键字越多,值越高。
DF: 文档频率,即包含关键字的文档ID个数。
IDF: 对DF取倒数:1/DF
TF-IDF分值: TF * IDF。TF-IDF 分值越高则搜索的优先级越高。

在这里插入图片描述
如上图hello出现的在ID中的次数为3,即 DF = 3 ,IDF = 1/3
id为1中 hello 出现1次,TF-IDF = 1/3 = 0.33
id为2中 hello 出现3次,TF-IDF = 3/3 = 1
id为3中 hello 出现1次,TD-IDF = 1/3 = 0.33

参考

https://mp.weixin.qq.com/s/iay2B4XGl5MuEqRBWqoipA

https://www.zhihu.com/question/323811022/answer/981341195

https://blog.csdn.net/qq_38929920/article/details/116527009

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Elasticsearch使用相关性评分来衡量查询结果与搜索查询的匹配程度。其中,两个主要的评分算法TF-IDF和BM25。 TF-IDF(词频-逆文档频率)是一种传统的评分算法,它考虑了词项在文档中的频率和在整个文集中的重要性。它通过计算词项在文档中的出现频率(TF)和在文集中的逆文档频率(IDF),来决定一个词项的相关性得分。TF-IDF评分越高,表示词项在文档中的出现频率越高且在整个文集中的重要性越大。 BM25是一种更先进的评分算法,它综合考虑了词项频率、文档长度和文档频率等因素。BM25对于常见词项的匹配较为慎重,但在罕见词项的匹配上具有更好的效果。相对于TF-IDF,BM25更适用于大型的文档集合和长文档。 在Elasticsearch中,影响相关性评分的因素包括: - 词项频率(Term Frequency,TF):词项在文档中的出现频率越高,相关性评分越高。 - 逆文档频率(Inverse Document Frequency,IDF):衡量词项的重要性,常见词项的IDF较低,罕见词项的IDF较高。 - 文档长度(Field Length):较长的文档可能会被降低相关性评分,以避免长文档在相关性上的优势。 - 文档频率(Document Frequency,DF):词项在文档集合中的出现频率越高,相关性评分越低。 综上所述,Elasticsearch使用TF-IDF和BM25等评分算法来衡量查询结果与搜索查询的相关性。评分算法会考虑词项频率、逆文档频率、文档长度和文档频率等因素,并根据这些因素为每个查询结果分配一个相关性得分。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【ElasticsearchElasticsearch自定义评分的N种方法](https://blog.csdn.net/qq_21383435/article/details/116569606)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

锥栗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值