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

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

  1. ElasticSearch读写底层原理及性能调优

    ##一,读写底层原理 Elasticsearch写人数据的过程 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点) 2)coordinating n ...

  2. 面试系列八 es写入数据的工作原理

    (1)es写数据过程 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点) 2)coordinating node,对document进行路由,将请求 ...

  3. 从提高 Elasticsearch 搜索体验说开去......

    Elasticsearch 最少必要知识实战教程直播回放 1.实战问题 球友提问:怎么搜索才能使得结果是最好的呢? 我这边一个搜索功能,实现做法就是将用ik分词器配合multi查询实现的. 中途也追加 ...

  4. ElasticSearch(搜索服务器)-第一天

    1为什么使用es ElasticSearch 搜索服务器.简称es. 初识es 搜索时数据库的问题 2.1是什么 搜索服务器 软件 2.1.1互联网搜索 https://www.baidu.com/ ...

  5. Lucene默认的打分算法——ES默认

    改变Lucene的打分模型 随着Apache Lucene 4.0版本在2012年的发布,这款伟大的全文检索工具包终于允许用户修改默认的基于TF/IDF原理的打分算法.Lucene API变得更加容易 ...

  6. ElasticSearch搜索底层基础原理总结

    目录: 1._search结果分析 2.multi-index和multi-type 3.分页查询与deep paging 4.query DSL和query string 5.mapping 6.倒 ...

  7. 倒排索引:ES倒排索引底层原理及FST算法的实现过程

    文章目录 引言 1.倒排索引核心原理 2.倒排索引的存储结构 2.1 倒排表(Posting List) 2.2 词项字典(Term Dictionary) 2.3 ​词项索引(Term Index) ...

  8. ElasticSearch面试 - es 写入数据的工作原理是什么啊?

    ElasticSearch面试 - es 写入数据的工作原理是什么啊? 面试题 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗? ...

  9. elasticsearch原理_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

最新文章

  1. 为多模型寻找模型最优参数、多模型交叉验证、可视化、指标计算、多模型对比可视化(系数图、误差图、混淆矩阵、校正曲线、ROC曲线、AUC、Accuracy、特异度、灵敏度、PPV、NPV)、结果数据保存
  2. FreeSWITCH在呼叫失败的情况下如何播放语音提示
  3. 解决springdatajpa 在解析实体类的字段时候驼峰自动转为下划线问题
  4. Saber2016安装包和安装详细安装步骤
  5. go:系统参数or函数--未完
  6. [mybatis]Configuration XML_mappers
  7. Jenkins --SVN
  8. boost::interprocess::named_mutex的翻译和学习
  9. Google+强推实名制引爆不满 用户增速放缓
  10. python-多线程共享内存
  11. Visio画UML图基本操作及技巧解析
  12. Sublime Text3报错:Error while loading PyV8 binary:exit code 3
  13. 详细关闭iiop方法_安卓手机卡顿清理垃圾是没用的,教你关闭几个设置,告别手机迟钝...
  14. 探索性测试(游戏向)
  15. 《#华为云#听从你心,无问西东》及网友跟帖
  16. 2021支付宝扫福玩法攻略
  17. MAYAPlugin_Mel_顶点法线批处理_V2
  18. SAP 薪酬计算流程
  19. 正点原子 核心板IMX6ULL IIC RTC驱动 PCF8563
  20. 迄今4代大数引擎概述

热门文章

  1. 2021年计算机二级5月份考试什么时候报名?
  2. Joolun uniapp商城源码实现商城自定义拖拽装修_Java二开源码
  3. 方舟染色文件用在服务器,方舟恐龙染色文件 | 手游网游页游攻略大全
  4. 平面设计没有基础要学多久可以工作?
  5. flowable画图教程_给初学者的RxJava2.0教程(七): Flowable
  6. 爱奇艺财报解读:首次实现季度盈利 会员当季净增440万
  7. 信息学奥赛一本通T1447:靶形数独
  8. 如何往bilibili里面插入视频
  9. 16 英寸 MacBook Pro:现在购买还是等待
  10. web前端第三天作业