分布式搜索引擎ElasticSearch之高级运用(三)
一、倒排索引原理
ES采用的是倒排索引(Inverted Index), 也称为反向索引。 有反向索引,也会有正向索引。
正向索引
正排索引是以文档的ID作为关键字,并且记录文档中每个字段的值信息,通过查询id来把整条文档拿出来。
但是在查询某一个keyword存在于哪些文档的时候, 需要对所有文档进行扫描匹配。这样检索效率比较低下。
倒排索引
倒排索引以字或词作为关键字索引, 倒排索引建立的是分词(Term)和文档(Document)之间的映射关系。
倒排索引表结构, 去除停用词后构造的倒排索引:
单词 文档ID列表 elasticsearch 1,3 最流行 1,2 搜索引擎 1 … 倒排索引主要由单词词典(Term Dictionary)和倒排列表(Posting List)及倒排文件(Inverted File)组成。
**单词词典(Term Dictionary):**搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合。
**倒排列表(PostingList):**倒排列表记载了出现过某个单词的所有文档的文档列表,以及单词在该文档中出现的位置信息及频率,每条记录称为一个倒排项(Posting)。
**倒排文件(Inverted File):**所有单词的倒排列表按顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。如何定位
对于规模很大的文档集合,里面可能包含上百万的关键单词(term), 找出某个特定的term就会很慢, 需要逐个过滤一遍,如何快速定位?
先做好排序,然后用二分查找的方式,这样比全部遍历方式来得更快,这个就是term dictionary。可以采用logN次磁盘查找获取目标,但是磁盘随机读操作仍然非常昂贵(一次随机读random access 大概需10ms),
所以尽量少读磁盘, 但缓存到内存中, 整个term dictionary又非常大, 于是就有了term index字典的索引。
term index 是b-tree结构:
这棵树不会包含所有的term,它只记录term的一些前缀。通过term index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找。
所以term index不需要存储所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。
二、评分TF/IDF/BM25计算
每条搜索记录ES都会给出一个评分,ES有两个打分计算方式:
TF: Term Frequency,即词频。它表示一个词在内容中出现的次数。定义:
TF = 某个词在文档中出现的次数 / 文档的总词数
某个词出现越多,表示越重要,如果某篇文章出现了elasticsearch多次, 而spring出现了两三次, 那很可能就是一篇关于elasticsearch的专业文章。
IDF: Inverse Document Frequency,即逆文档频率,它是一个表达词语重要性的指标。计算公式:
IDF=log(库中的文档数/(包含该词的文档数+1))
log为对数函数,如果所有文章内容都包涵某一个词,那这个词的IDF=log(1)=0, 重要性为零。停用词的IDF约等于0。
如果某个词只在很少的文章中出现,则IDF很大,其重要性也越高。为了避免分母为0,所以+1.
BM25
BM25 实质是对 TF-IDF 算法的改进,对于 TF-IDF 算法,TF(t) 部分的值越大,整个公式返回的值就会越大。
随着TF(t) 的逐步加大,该算法的返回值会趋于一个数值,BM25 就针对这点进行来优化。
例如, 某个文章的关键词出现的频率不断增多, 得分就会越来越高, 有的文章关键词出现40次, 和有的文章关键词出现60次或80次, 但实际上出现40次的文章,可能就是所期望的结果。
查看ES评分计算:
增加explain标识为true,会列出计算执行计划:
GET /movies/_search {"explain": true, "query":{"match":{"title":"heart"}} }
里面会详细记录评分细则:
... "_explanation" : {"value" : 6.0875173,"description" : "weight(title:heart in 276) [PerFieldSimilarity], result of:","details" : [{"value" : 6.0875173,"description" : "score(freq=1.0), computed as boost * idf * tf from:","details" : [{"value" : 2.2,"description" : "boost","details" : [ ]},{"value" : 5.8863263,"description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:","details" : [...
整个评分计算: boost * idf * tf (boost为放大系数, 默认为2.2)
BM25的计算在tf的描述中: (freq + k1 * (1 - b + b * dl / avgdl))
本文由mirson创作分享,如需进一步交流,请加QQ群:19310171或访问www.softart.cn
分布式搜索引擎ElasticSearch之高级运用(三)相关推荐
- 分布式搜索引擎-ElasticSearch(上集)
个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 分布式搜索引擎-Elasti ...
- 分布式搜索引擎ElasticSearch(四) -- 插件使用
2019独角兽企业重金招聘Python工程师标准>>> 分布式搜索引擎ElasticSearch(四) -- 插件使用 博客分类: 搜索引擎,爬虫 首先 非常感谢国内大神 - Med ...
- 微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游
分布式搜索引擎01 -- elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是 ...
- SpringBoot2.x集成分布式搜索引擎Elasticsearch
参考资料: https://my.oschina.net/uwith/blog/3226665 https://www.freesion.com/article/8399663484/ https:/ ...
- 分布式搜索引擎ElasticSearch+Kibana (Marvel插件安装详解)
在安装插件的过程中,尤其是安装Marvel插件遇到了很多问题,要下载license.Marvel-agent,又要下载安装Kibana 版本需求 Java 7 or later Elasticsear ...
- ElasticSearch logo 分布式搜索引擎 ElasticSearch
原文来自:http://www.oschina.net/p/elasticsearch Elastic Search 是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中 ...
- 分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程
ElasticSearch ElasticSearch进阶教程 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 无条件查询 有查询条件 叶子条件查询(单字段查询条件) 组合条件查 ...
- 分布式搜索引擎ElasticSearch
总结前言: 因为最近项目开发有用到ElasticSearch,之前在去年年底也在技术交流研讨会上听过这个技术,其实听过很多次,但是每次都没有关注,直到现在用到了,就在这做一个总结,也是写一下学习成果, ...
- 分布式搜索引擎Elasticsearch(一):Elasticsearch命令
前言:本文为原创 若有错误欢迎评论! linux安装elasticsearch6.5.4与windows下的kibana 请参考我的博客https://blog.csdn.net/weixin_439 ...
最新文章
- 【学术相关】博士毕业也会看第一学历吗?
- 都说现在的主流技术是Flink,那么让我们看看FLink在网易是如何实战的?
- sap权限激活_如何激活凭证流Fiori应用
- csvn(apache+svn)管理工具搭建
- [2018湖南省队集训] 6.28 T3 simulate
- 15 WM配置-主数据-定义存储区标识符(Storage Section Indicators)
- Teradata 金融数据模型FS-LDM
- LINQ 之 JOIN(2)
- HUST 1585 排队
- Thread中yield方法
- UnityEditor-Windows编辑器与Inspector编辑器
- mac excel mysql数据库_macOS系统的Excel从MySQL数据库查询数据的设置方法
- 图像处理之常见二值化方法汇总
- vs 2010旗舰版问题
- C++作业之模拟打牌:小喵钓鱼
- 论文笔记:Attention U-Net: Learning Where to Look for the Pancreas
- 摄像头网络直播方案LiveGBS部署问题 使GB28181实现无插件web直播
- 开发票服务器返回信息为空,使用 getinvoicebatch 批量接口获取发票信息,返回成功,但数据是空的...
- CC2640R2F BLE5.0 CC2640R2F UART驱动
- MySQL启动报错:发生系统错误5。拒绝访问。