Elasticsearch 理解相关性评分(TF-IDF、BM25等)

news/2024/9/11 3:48:20/ 标签: elasticsearch, tf-idf, jenkins

在Elasticsearch中,相关性评分是搜索功能的核心,它决定了搜索结果的质量和排序。了解Elasticsearch是如何计算相关性评分的,特别是TF-IDF和BM25算法,对于优化搜索性能和结果至关重要。本文将深入探讨这两种算法及其在Elasticsearch中的应用。

一、相关性评分简介

相关性评分是衡量搜索结果与用户查询匹配程度的指标。Elasticsearch通过复杂的算法计算每个文档与查询的相关性得分,得分越高,表示文档与查询的匹配程度越高。在电商网站、知识库等应用场景中,相关性评分直接决定了用户能否快速找到他们需要的信息。

二、TF-IDF算法

2.1 定义与原理

TF-IDF(Term Frequency-Inverse Document Frequency)是一种经典的信息检索算法,用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。它由两部分组成:

  • TF(Term Frequency):词频,即词语在文档中出现的次数。计算公式为:TF = (词语在文档中出现的次数) / (文档中总词语数)。
  • IDF(Inverse Document Frequency):逆文档频率,即词语在文档集合中的普遍重要程度。计算公式为:IDF = log((文档集合中文档总数) / (包含词语的文档数 + 1))。

2.2 优缺点

TF-IDF算法简单高效,但它也有明显的局限性。例如,它没有考虑文档长度和搜索词位置等因素,且对于高频词容易过度强调。

三、BM25算法

3.1 定义与原理

BM25(Best Matching 25)算法是对TF-IDF算法的改进和扩展,它在计算相关性得分时引入了更多因素,如文档长度和搜索词位置等。BM25算法的主要目的是提高检索结果的质量,特别是在处理大规模文档集合时。

BM25算法的基本公式为:

[
\text{Score}(D, Q) = \sum_{i=1}^{n} \text{IDF}(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{|D|}{\text{avgdl}})}
]

其中, D D D 表示文档, Q Q Q 表示查询, q i q_i qi 表示查询中的词项, f ( q i , D ) f(q_i, D) f(qi,D) 表示词项 q i q_i qi在文档 D D D中的频率, ∣ D ∣ |D| D 表示文档 D D D的长度, avgdl \text{avgdl} avgdl 表示文档集合中所有文档的平均长度, k 1 k_1 k1 b b b 是可调节的参数。

3.2 优缺点

BM25算法相对于TF-IDF算法有以下优点:

  • 文档长度归一化:考虑了文档长度对词频的稀释作用。
  • 词频饱和度调整:通过引入对数函数调整词频的饱和度,避免了高频词的过度强调。
  • 文档频率饱和度:引入了文档频率的饱和度因子,用于调整文档频率的影响。

然而,BM25算法也有其复杂性,需要调整多个参数以达到最佳效果。

四、Elasticsearch中的应用

4.1 版本差异

在Elasticsearch 5.0版本之前,默认使用的是TF-IDF算法进行相关性评分。从5.0版本开始,Elasticsearch默认使用BM25算法,因为它在实际应用中表现更为优秀。

4.2 调试与优化

为了深入了解Elasticsearch是如何计算文档与查询的相关性得分的,可以使用_explain API。这个API可以返回每个查询项在文档上的得分解释,包括各个组成部分(如子查询、因子、标准化等)及其对总评分的具体贡献。

例如,可以使用以下命令查看特定查询的TF-IDF或BM25得分:

GET /my_index/_search
{"explain": true,"query": {"match": {"text": "this is the first document"}}
}

4.3 实际应用场景

在电商网站中,用户可以输入关键词“手机”进行搜索。Elasticsearch会根据索引中所有包含“手机”的文档,并使用BM25算法计算它们的相关性得分。得分高的文档会排在搜索结果的前面,从而提高了用户体验。

五、总结

Elasticsearch的相关性评分机制是基于复杂的算法实现的,其中TF-IDF和BM25算法是两种重要的评分算法。了解这些算法的原理和应用,对于优化Elasticsearch的搜索性能和结果至关重要。通过调整算法参数和使用_explain API进行调试,


http://www.ppmy.cn/news/1475423.html

相关文章

vue3 ts 报错:无法找到模块“../views/index/Home.vue”的声明文件

解决办法: env.d.ts 新增代码片段: declare module "*.vue" {import type { DefineComponent } from "vue";// eslint-disable-next-line typescript-eslint/no-explicit-any, typescript-eslint/ban-typesconst component: Define…

C#面:阐述控制反转是什么?

控制反转(Inversion of Control,缩写为IoC),是⾯向对象编程中的⼀种设计原则,可以⽤来减低计算机代码之间的耦合度。其中最常⻅的⽅式叫做依赖注⼊(Dependency Injection,简称DI)&am…

深入解析C#中的Stopwatch类:精准计时的艺术

目录 引言 了解Stopwatch类 创建与使用Stopwatch 使用多个Stopwatch实例 性能分析与优化 结论 后记 引言 在软件开发中,性能分析是不可或缺的一环,它帮助我们识别瓶颈、优化代码,确保应用程序的高效运行。C#中的Stopwatch类便是开发者…

数据湖仓一体(六)安装flink

上传安装包到/opt/software目录并解压 [bigdatanode106 software]$ tar -zxvf flink-1.17.2-bin-scala_2.12.tgz -C /opt/services/ 重命名文件 [bigdatanode106 services]$ mv flink-1.17.2-bin-scala_2.12 flink-1.17.2 配置环境变量 [bigdatanode106 ~]$ sudo vim /etc…

Elasticsearch:Node.js ECS 日志记录 - Morgan

这是之前系列文章: Elasticsearch:Node.js ECS 日志记录 - Pino Elasticsearch:Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中,我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.j…

threejs

1.场景清空,释放内容 // 假设你已经有一个Three.js的场景对象scene// 函数:清空场景中的所有对象 function clearScene(scene) {while(scene.children.length > 0){const object scene.children[0];if(object.isMesh) {// 如果有几何体和材质&#…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(2)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案(第1批次)(2) 第21题:在一个大型信息系统项目中,项目经理发现尽管已经建立了沟通机制,但团队间的沟通依然不畅,项目风险…

免费开源工具—— Clarity Al:一键图像放大/增强,Magnific平替!

今天给大家推荐一款图像增强工具——Clarity AI ,免费且开源,快来看看吧! 1、效果展示 MagnificAl是一款基于人工智能技术的图像处理工具,主要功能包括图像放大、像素级AI重绘、灵活的设置调整以及多种优化场景。它能够支持最高放大至16倍,甚…

电脑 DNS 缓存是什么?如何清除?

DNS(Domain Name System,域名系统)是互联网的重要组成部分,负责将人类易记的域名转换为机器可读的 IP 地址,从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制,通过临时存储已解析的域名信息&#xf…

PG大会周五于杭州举办;Pika发布4.0;阿里云MySQL上线Zero-ETL集成能力

重要更新 1. PostgreSQL中国技术大会举行12日(周五)于杭州举办,是PostgreSQL社区年度的大会,举办地点:杭州君尚云郦酒店(杭州市上城区临丁路1188号),感兴趣的可以考虑现场参加 ( [1]…

iCloud数据宝库:全方位掌握笔记应用数据存储

iCloud数据宝库:全方位掌握笔记应用数据存储 在数字化时代,我们的日常生活和工作中产生了大量的笔记数据,这些数据的安全性、可访问性和同步性至关重要。苹果的iCloud服务提供了一个强大而便捷的解决方案,允许用户在所有设备上存…

向量索引【草稿】

用「向量」化数据表示「概念」。 向量表达:概念上更为接近的点在空间中更为聚集,而概念上更为不同的点,则距离更远。 向量数学表达:以坐标原点为起点,这些坐标点重点。 在语言上应用–词向量。 一个训练恰当的词向量集合,将和指代的事物之间的向量集合十分接近。有利于自…

智能家居装修怎么布线?智能家居网络与开关插座布置

打造全屋智能家居。计划的智能家居方案以米家系列为主,智能家居联网方案以无线为主。装修前为了装备智能家居做了很多准备工作,本文深圳侨杰智能分享一个智能家居装修和布线方面的心得与实战知识。希望能对大家的装修有所帮助。 ​1.关于网络 如果房子比…

VUE export import

在Vue.js项目中,export 和 import 是ES6(ECMAScript 2015)模块系统的一部分,用于在JavaScript文件中导出和导入模块(比如组件、函数、变量等)。这对于组织大型项目中的代码、提高代码的可复用性和可维护性非…

什么是面向对象编程

什么是面向对象编程?(OOP) ● 面向对象编程是一种基于对象概念的编程范式;(所谓的编程范式,就是代码风格,我们“如何”编写和组织代码); ● 我们使用对象来模拟&#xf…

新版k8s拉取镜像失败问题

新版版从k8s从1.23后放弃使用docker容器作为的默认运行时了,而是采用的containerd,使用时不在使用docker拉取镜像,这就带来了一系列的问题。在k8s1.24之后用户可以选择docker或者选择contained作为容器运行时,如果不指定使用的doc…

Postman 中的 API 安全性测试:最佳实践与技巧

在当今快速发展的数字化世界中,API(应用程序编程接口)已成为软件系统之间通信的桥梁。然而,随着API使用的增加,安全风险也随之上升。本文将详细介绍如何在 Postman 中进行 API 的安全性测试,帮助开发者和测…

循环结构(一)——for语句【互三互三】

文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…

一类账户认证API在Java、Python、PHP中的使用教程

随着金融科技的快速发展,一类账户认证在金融服务中扮演着越来越重要的角色。对于个人和企业而言,拥有一个高级别的账户不仅能提高交易效率,还能享受到更多优惠和服务。然而,这也带来了账户安全的挑战和风险。 为了确保账户的真实…

Java基础之集合

集合和数组的类比 数组: 长度固定可以存基本数据类型和引用数据类型 集合: 长度可变只能存引用数据类型存储基本数据类型要把他转化为对应的包装类 ArrayList集合 ArrayList成员方法 添加元素 删除元素 索引删除 查询 遍历数组