Elasticsearch-相关性

相关性描述的是⼀个⽂档和查询语句匹配的程度。ES 会对每个匹配查询条件的结果进⾏算分_score。_score 的评分越高,相关度越高。

ES 5.0之前使用TF-IDF 相关性算法, 5.0之后使用了BM25算法

TF-IDF 

公式

score(q,d) = queryNorm(q)

                    · coord(q,d)
                    · ∑ (

                           t.getBoost()

                           .tf(t in d)
                           · idf(t)
                           · norm(t,d)
                         ) (t in q)

  • score(q,d)  文档d对查询q的相关性得分
  • queryNorm(q)  查询的规范化因子
  • coord(q,d)  协调因子
  • 文档d的查询q中每个词t的权重之和
  • tf(t in d)  文档d中t词的词频(出现次数)
  • idf(t)  t词的逆文档频率
  • t.getBoost() 已应用于查询的boost
  • norm(t,d)  是字段长度归一值,与检索时字段的Boost (如果存在)相结合。

BM25

整体而言 BM25 就是对 TF-IDF 算法的改进,对于 TF-IDF 算法,TF(t) 部分的值越大,整个公式返回的值就会越大。BM25 就针对这点进行来优化,随着TF(t) 的逐步加大,该算法的返回值会趋于一个数值。如下图所示:

公式

该公式前半部分是IDF, 后半部分是TF + NORM

  • IDF(qi,D):查询项的逆文档频率
  • N:索引中的文档总数
  • n(qi) : 索引字段中包含查询项的文档数量
  • f(qi,D):  查询项在文档D中出现的频次
  • k1:  这个参数控制着词频结果在词频饱和度中的上升速度。默认值为1.2。值越小饱和度变化越快,值越大饱和度变化越慢
  • b: 这个参数控制着字段长归一值所起的作用,0.0会禁用归一化,1.0会启用完全归一化。默认值为0.75
  • |D|: 代表文档的长度,
  • avgdl: 代表索引中平均字段长度

explain

PUT /blogs_index
{"settings": {"index": {"number_of_shards": 1,"number_of_replicas": 0}},"mappings": {"dynamic": false,"properties": {"title": {"type": "text","analyzer": "ik_smart"},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}}
}POST /blogs_index/_bulk
{"index":{"_id":"1"}}
{"title":"es的相关度","content":"这是关于es的相关度的文章"}
{"index":{"_id":"2"}}
{"title":"相关度","content":"这是关于相关度的文章"}
{"index":{"_id":"3"}}
{"title":"es","content":"这是关于关于es和编程的必看文章"}
{"index":{"_id":"4"}}
{"title":"关注我,系统学习es","content":"这是关于es的文章,介绍了一点相关度的知识"}GET /blogs_index/_analyze
{"text": ["es的相关度"],"field": "title"
}{"tokens" : [{"token" : "es","start_offset" : 0,"end_offset" : 2,"type" : "ENGLISH","position" : 0},{"token" : "的","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 1},{"token" : "相关","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 2},{"token" : "度","start_offset" : 5,"end_offset" : 6,"type" : "CN_CHAR","position" : 3}]
}GET /blogs_index/_search
{"query": {"match": {"title": "es的相关度"}},"explain": true
}

文档总分 

查询结果中文档一得分2.5933092是有四个分词es,的,相关,度的分数相加所得

2.5933092 = 0.31387398 + 1.0594962 + 0.60996956 + 0.60996956

单个词得分

词es在分档1中的得分是0.31387398,如图描述是由boost * idf * tf 所得

0.31387398 = 2.2 * 0.35667494 * 0.40000004

单个词idf得分

词es在分档1中的idf得分0.35667494

0.35667494 = In(1 + (4 - 3 + 0.5) / (3 + 0.5)) = In (1 + 3/7) = In(10/7) 

单个词tf得分

词es在分档1中的tf得分0.40000004, dl是文档1中title的分词数4, avgdl是整个索引title的平均分词数

0.40000004 = 1 / (1 + 1.2 *(1 - 0.75 + 0.75 * 4 / 3))= 1 / 2.5 

更改BM25 参数 k1 和 b 的值

在介绍BM25算法时,我们知道 k1 参数【默认值1.2】控制着词频结果在词频饱和度中的上升速度。b 参数【默认值0.75】控制着字段长归一值所起的作用。

那么我们就可以通过手动定义这两个参数的值从而去改变相关性算分。

只能在创建index的时候定义字段的similarity ,在后续,可以通过关闭索引,更新索引设置,开启索引这个过程进行更新 my_bm25 的 参数值。这样可以无须重建索引又能试验不同的相似度算法配置。

PUT /blogs_index
{"settings": {"similarity": {"my_bm25": {"type": "BM25","b": 0.8,"k1": 1.5}}},"mappings": {"dynamic": false,"properties": {"title": {"type": "text","analyzer": "ik_smart","similarity": "my_bm25"},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}}
}

参考文献

[1]. https://www.cnblogs.com/geeks-reign/p/Okapi_BM25.html
[2]. Okapi BM25: a non-binary model
[3]. ES系列13:彻底掌握相关度:从TF-IDF、BM25到对相关度的控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/572938.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将jupyter notebook文件导出为pdf(简单有效)

1.打开jupyter notebook笔记: 2.点击file->print Preview 3.在新打开的页面右键打印 4.另存为PDF 5.保存即可 6.pdf效果 (可能有少部分图片显示不了) 网上也有其他方法,比如将其转换为.tex再转为PDF等,但个人觉…

如何在 Mac/Windows 上从 iPhone 备份中恢复短信?

- “如何从 iPhone 备份中提取短信?” 短信正在取代日常生活和工作中的电话和电子邮件。 iPhone 上的短信现在是您与朋友、家人、亲人和同事最重要的沟通方式之一。有时,您可能想在 iPhone 上保留一些您不想丢失的特殊消息,也许这是朋友的一…

以太网链路聚合——增加带宽,解决生成树收敛慢的问题

目录 一.对STP生成树的补充 1.STP接口状态 2.STP生成树的改进 二.网络可靠性 1.单板可靠性 2.设备可靠性 3.链路可靠性 三.链路聚合 1.多条链路聚合增加带宽 2.链路聚合术语 四.链路聚合模式 1.手动模式 2.LASP模式 (1).LASP术语 (2&…

Pillow教程07:调整图片的亮度+对比度+色彩+锐度

---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…

快速幂算法在Java中的应用

引言: 在计算机科学和算法领域中,快速幂算法是一种用于高效计算幂运算的技术。在实际编程中,特别是在处理大数幂运算时,快速幂算法能够显著提高计算效率。本文将介绍如何在Java中实现快速幂算法,并给出一些示例代码和应…

保姆级指导0基础如何快速搭建“对话机器人”类ChatGPT

参考了CDSN上的文章,但发现不work, 不是这里有问题,就是那里有问题,查阅了大量的资料,做了无数次试验,终于整理出来了一个完整的教程,保可用,保真~~~~~如果各位遇到什么问题&#xf…

Ceph——部署

Ceph简介 Ceph是一款开源的 SDS 分布式存储,它具备极高的可用性、扩展性和易用性,可用于存 储海量数据 Ceph的存储节点可部署在通用服务器上,这些服务器的 CPU 可以是 x86 架构的,也可以 是 ARM 架构的。 Ceph 存储节点之间相互…

边缘计算迎来“量子飞跃”!支持抗量子密码,AMD推出FPGA新系列

3月6日,AMD宣布推出AMD Spartan™ UltraScale™ FPGA系列,这是AMD成本优化FPGA和自适应SoC广泛产品组合的最新成员。 距离1月22日,AMD推出业界首款符合VESA DisplayPort 2.1标准的FPGA和自适应SoC实现,也才过了一个多月的时间。 S…

华为实验-基于用户和应用的安全策略

CLI举例:基于用户和应用的安全策略 通过配置安全策略,实现基于用户、时间段以及应用的访问控制。 组网需求 如图1所示,某企业在网络边界处部署了FW作为安全网关。 企业根据员工级别和职能不同划分了三种用户:高层管理者、市场员…

YOLOv8项目实践——目标检测、实例分割、姿态估计、目标追踪算法原理及模型部署(Python实现带界面)

简介 Ultralytics YOLOv8是一种前沿的、最先进的(SOTA)模型,它在前代YOLO版本的成功基础上进行了进一步的创新,引入了全新的特性和改进,以进一步提升性能和灵活性。作为一个高速、精准且易于操作的设计,YO…

单链表交叉分离,运用头插法,尾插法(算法库应用)

原文博客链接:单链表分离(头插法和尾插法的结合,理解指针变换)_3.对任务1或者2中创建的某一个单链表{a1,b1,a2,b2,...,an,bn},编写一个算法将-CSDN博客 函数实现: /************************************************** 函数名:separate_LinkList 功 能: 把一个链表,交叉新建…

flask各种版本的项目,终端命令运行方式的实现

目录 写在前面 一、Flask项目的基本结构 二、使用终端命令运行Flask项目 1. 安装Flask 2. 创建Flask应用 3. 配置FLASK_APP环境变量 4. 运行Flask应用 5. 访问Flask应用 三、Flask CLI的其他功能 1. 创建Flask应用 2. 运行开发服务器 3. 清理缓存文件 4. 运行单元…