ElasticSearch查询时修改打分

news2024/11/15 13:54:02

原生的ES打分基于BM25算法,相比于TF-IDF已经有了较大的改进,但是在实际场景中往往最终的排序效果还是需要进行调整。由于直接修改索引的权重往往代价较大,比较经济的方式还是在查询时即时修改得分以实现排序控制。

注:案例测试数据详见:ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)-CSDN博客 中的第三部分。

场景一:negative_boost

适用场景:想降低某些关键词的检索权重,但这些文档往往又包含我们想命中的关键词,直接去掉也不合适,只能把排名降低。

例如,针对以下case,我们想搜包含“新疆”的文档:

GET article/_search
{
  "query": {
    "match": {
      "title": "新疆"
    }
  }
}

直出的结果为:

编号002的在003前面。

假设我们的需求是想让出现“中欧”关键词的文档相关度降低,则可以使用negative_boost:

GET article/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "title": "新疆"
        }
      },
      "negative": {
        "match": {
          "title": "中欧"
        }
      },
      "negative_boost": 0.5
    }
  }
}

 效果:

调整后编号003的在002的前面,因为标题包含“中欧”的文档的分值乘以了negative_boost(0.5)后被降低了。

场景二:script_score

适用场景:利用索引数据中既有的一些数值字段细粒度控制打分函数。有些索引中本来就有可以用来排名的字段(比如点赞数,阅读数,评论数等等)。

还是上文的案例,默认情况下搜“新疆”,文档002在003之前,但很明显,文档003的阅读量(readNumber)更高,我们想让其排在前面。可以使用如下的查询:

GET article/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": "新疆"
        }
      },
      "script_score": {
        "script": {
          "source": "_score * (doc['readNumber'].value)"
        }
      }
    }
  }
}

注意script_score要写在function_score里,其中_score * (doc['readNumber'].value)的意思是:将原始的打分乘以readNumber(阅读量)字段的值作为最终的打分。

最终效果如下:

场景三:field_value_factor

适用场景:和script_score类似,更注重打分平滑性。

还是上文的案例,默认情况下搜“新疆”,文档002在003之前,但很明显,文档003的阅读量(readNumber)更高,我们想让其排在前面。可以使用如下的查询:

GET article/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": "新疆"
        }
      },
      "field_value_factor": {
        "field": "readNumber",
        "modifier": "log1p",
        "factor": 2,
        "missing": 1
      },
      "boost_mode": "multiply"
    }
  }
}

field_value_factor的含义:

field:待计算的字段

modifier:打分函数

factor:field计算时乘以的因子

missing:缺失值

boost_mode:和原始打分_score的结合方式。分 sum / avg / multiply / max / min / replace

上述语句的含义等于:

新分数=原分数 * log(1 + 2 * readNumber)

效果如下:

优势是得分相对比较光滑,比较接近。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MO DOCKER - Docker synopsis - Huge

Docker synopsis website addressDocker series2.1 今日课程介绍2.2 初始docker - 什么是docker website address url address Docker series 2.1 今日课程介绍 2.2 初始docker - 什么是docker 项目部署的问题 大型项目组件较多, 运行环境也较为复杂,部署时会碰到一些问题…

VR MR AR 的区别

VR(Virtual Reality)、MR(Mixed Reality)和AR(Augmented Reality)是三种不同的沉浸式技术,它们各自在交互方式、信息呈现和环境感知方面有着显著的区别。 以下是这三种技术的详细对比: VR (Virtual Reality) 虚拟现实 定义与特点: 完全沉浸:VR技术通过头戴式显示器…

keil创建单片机工程

一、创建工程 打开Keil uVision4,依次选择 Project—>New uVision4 Project,选择工程保存路径及填写工程名称,如下图 然后点“保存”。在Select a CPU Data Base File中选择"STC MCU Database",点 "OK"&am…

Linux/Usage

Usage Enumeration nmap 首先使用 nmap 默认配置扫描系统端口对外开放情况,发现对外开放了 22 和 80 端口,然后又扫描了这两个端口的详细信息,情况如下 ┌──(kali㉿kali)-[~/vegetable/HTB/Usage] └─$ nmap -sC -sV -p 22,80 -oA nmap…

Spring的过滤器、拦截器、切面区别及案例分析

Spring的过滤器、拦截器、切面 三者的区别,以及对应案例分析 一、三者的实现方式 1.1 过滤器 xxxFilter 过滤器的配置比较简单,直接实现Filter接口即可,也可以通过WebFilter注解实现对特定URL的拦截,Filter接口中定义了三个方法…

选择ERP系统需要考虑哪些因素 企业ERP系统选型指南

ERP系统是一个复杂的软件系统,中小企业要建成ERP系统首先是要选择一个适合自己的ERP软件。目前市场上的ERP软件品种繁多,功能各异,那么中小企业应如何结合自己的实际情况“量体裁衣”找到最适合自己的ERP软件呢?这是目前中小企业进行ERP选型…

Axure糖尿病健康管理APP原型 (知识科普/病友社区/远程医生会诊/购物商城/血糖监测/饮食监测)

作品概况 页面数量:共 50 页 源文件格式:rp格式,兼容 Axure RP 9/10,非程序软件无源代码 应用领域:医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图,设计规范内容清晰…

一款新型的Linux服务器管理工具

最近发现了一款新型的Linux服务器管理工具,名称叫1Panel,本文跟大伙分享一下。 一. 产品介绍 1Panel 是一个开源的 Linux 服务器运维管理面板,具有丰富的功能,可对服务器和容器进行管理。 产品提供简洁直观的We图形界面&#x…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…

数据结构实验(二)

单链表的基本操作 一、总的设计思路(c++实现) 1、首先定义一个包含name、gender、student_number、hobbies的学生信息结构体。 2、接着一一写出:链表初始化(initialize)函数、后插法插入(insert)函数、打印信息(output)函数、对链表结点进行排序(sortList)函数、…

【前后端】django前后端交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、django是什么二、django前后端交互指引三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发语言&#x…

质量精美的UI设计素材库:3000+图标设计资源免费下载!

作为一名设计师&#xff0c;你的设计灵感来自哪里&#xff1f;想象一下吗&#xff1f;事实上&#xff0c;材料库仍然是大多数设计师必不可少的东西&#xff0c;如果你能更方便地找到他们可用的设计材料&#xff0c;那么在创作中&#xff0c;无疑可以用一半的努力得到两倍的结果…

Qt绘制边框有阴影兼容性问题

在Qt开发过程中&#xff0c;有时候我们要显示一个有阴影的对话框&#xff0c;这时一般采用自定义实现&#xff0c;然而最近在开发时软件时&#xff0c;Win11上显示正常&#xff0c;Win10或其他Win11电脑显示不正常&#xff0c;存在兼容性问题吗&#xff1f; 下面是具体的源码 …

【wsl】安装nvm配置

安装nvm 参考https://github.com/nvm-sh/nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashexport NVM_DIR"$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

JS数组操作:去重,交集,并集,差集

文章目录 去重并集交集差集 去重 //定义常量 res,值为一个Map对象实例 //返回arr数组过滤后的结果&#xff0c;结果为一个数组 //过滤条件是&#xff0c;如果res中没有某个键&#xff0c;就设置这个键的值为 const res new Map(); const arr [1,1,2,2,3,4,4,5,6,6,6,6,4,3];…

MIGO行项目屏幕增强

MIGO行项目屏幕增强 一、增强描述 由于在事务码MIGO中存在的字段中没有能够满足客户需求的字段&#xff0c;所以需要在事务码MIGO的屏幕中添加一个新的页签用来保存物料凭证中行项目增加的字段。 通过查找BADI的程序ZDEMO_BADI,输入参数MIGO后&#xff0c;得到对应BADI为MB_M…

面试官竟然是个小黑子,问我用过状态机吗

状态机的组成 状态机是一种抽象的数学模型&#xff0c;描述了对象或系统在特定时间点可能处于的各种状态以及状态之间的转换规则。它由一组状态、事件、转移和动作组成&#xff0c;用于模拟对象在不同条件下的行为和状态变化。 状态机包括以下基本组成部分&#xff1a; 状态&…

React首次加载渲染2次的问题

在开发React项目的时候&#xff0c;发现useEffect会调用2次的情况&#xff0c;依赖数组明明没有变化&#xff0c;怎么会调用2次&#xff1f;百思不得其解&#xff0c;依赖没变化的话&#xff0c;那肯定是整个组件重渲染了。 最最简单的代码如下&#xff1a; const container …

微信抽奖活动怎么做_微信抽奖大狂欢

随着科技的飞速发展&#xff0c;微信已经成为我们生活中不可或缺的一部分。它不仅仅是一个简单的通讯工具&#xff0c;更是一个集社交、购物、娱乐等多种功能于一体的平台。今天&#xff0c;我们为大家带来了一场别开生面的微信抽奖活动&#xff0c;让你在享受乐趣的同时&#…

三相电子式电表ADL400储能防逆流含CE/MID认证

安科瑞薛瑶瑶18701709087/17343930412 ADL400 导轨式多功能电能表&#xff0c;是主要针对电力系统&#xff0c;工矿企业&#xff0c;公用设施的电能统计、 管理需求而设计的一款智能仪表&#xff0c;产品具有精度高、体积小、安装方便等优点。集成 常见 电 力参数测量及电能…