elasticsearch搜索分数自定义以及相关度计算相关

article/2025/8/28 4:53:52

elasticsearch搜索分数自定义以及相关度计算相关

es通过其score字段对搜索结果进行排序 在进行业务开发时通常其默认的分数计算是不符合预期的。

最简单的方法是通过boost字段来对每一个字段进行权重设置,来体现该字段的重要性。
boost字段会导致分数的计算公式发生改变,boost默认为1 例如:

GET productinfo/_search
{"_source": ["spuTitle","classifyName"],  "query": {"bool": {"should": [{"match": {"spuTitle": {"query": "服装","boost": 1}}},{"match": {"classifyName.text": {"query": "运动","boost": 1}}}]}}
}

这样的一段简单搜索,根据should匹配标题和分类,通常默认的权重两者都为1,但是我们的搜索结果为
在这里插入图片描述
很明显,我们可能需要将分类为运动的相关命中条目优先展示,但是结果是第二条便出现了服装鞋履分类,而后续的条目还有运动相关的条目,这并不符合我们的预期,我们需要将运动的权重设置更高,例如:

GET productinfo/_search
{"_source": ["spuTitle","classifyName"],  "query": {"bool": {"should": [{"match": {"spuTitle": {"query": "服装","boost": 1}}},{"match": {"classifyName.text": {"query": "运动","boost": 5}}}]}}
}

此时将分类的boost设置为5之后,结果为:
在这里插入图片描述
看似达到了我们的预期,但是当需要考虑的字段过多时,boost这种简单的方式就显得不够灵活了,当然如果我们从多个索引中查询,也可以对索引进行boost的权重设置,例如:

GET /productinfo_*/_search 
{"indices_boost": { "productinfo_1": 3,"productinfo_2": 2},"query": {"match": {"text": "运动鞋"}}
}

es为我们提供了一种有效的分数自定义方式,非常灵活,接下来我们将使用functionscore来重定义我们的分数
首先我们需要一个在索引mapping里自定义一个用于影响分数计算的字段myscore,type=long
我们通过权重设置来进行优先级的排序,而自定义分数更多的是用于在业务上的干预。例如通过热度来提升相应的优先度。
使用functionscore后的查询为:

GET productinfo/_search
{"explain": true,"query": {"function_score": {"query": {"bool": {"should": [{"match": {"spuTitle": {"query": "服装","boost": 1}}},{"match": {"classifyName.text": {"query": "服装","boost": 1}}}]}}, "functions": [{"field_value_factor": {"field": "score" ,"modifier": "log2p", "factor": 10}}], "score_mode": "sum", "boost_mode": "sum"}}
}

functionscore通常有以下几种方式:

  1. weight(权重,score*weight)
  2. field_value_factor(通过该值来加入自定义的因素进行考虑)
  3. random_score(对每一个用户使用一致的随机评分,即一个用户看到的始终是不变的,但每个用户不同)
  4. 衰减函数-linear、 exp 、 gauss(通常应用于经纬度的因素考虑)
  5. script_score(自定义分数脚本,上述无法实现需求时通过Groovy来编写)

上述使用第二种方式加入一个自定义分数字段来影响es的评分。
上述参数中,modifier参数用于平滑分数计算的方式,如果只定义field字段,不定义modifier,或者其他属性,分数计算公式为:
oldscore * myscore
上述分数计算方式是线性的,对结果影响较大,明显不符合我们的需求。

而引入modifier之后,在查询时加入 “explain”: true,可以看到解析本次查询,可以看到,

         {"value" : 0.30103,"description" : "min of:","details" : [{"value" : 0.30103,"description" : "field value function: log2p(doc['score'].value * factor=1.0)","details" : [ ]},{"value" : 0.4,"description" : "maxBoost","details" : [ ]}]}

description字段列出了我们设置的functionscore,即:
log2p(doc[‘score’].value * factor=1.0)
即以10为底取我们自定义的myscore字段的值乘以factor2的对数
即log10(2),由于自定义score为0所以结果为
在这里插入图片描述
与上述分数结果一致。

score_mode:

score_mode参数是functionscore内的一组设置的打分方式,默认为multiply也就是相乘,即一组funtionscore内的几项设置打分结果相乘,为了避免系数威力过大,建议设置为sum

boost_mode:

score_mode是设置查询外部打分与functionscore之间的模式,默认也为multiply,设置为sum

max_boost

除上述两种模式可以设置之外,还可以设置max_boost参数,该参数用来限制functionscore的打分结果,最大不超过指定值,如果超过指定值,将使用指定值作为计算结果

weight的作用

weight作为functionscore的一种方式,类似于boost,例如当我们有两个自定义分数条件,一个为热度分数,一个为店铺评分,我们想要店铺的评分更加重要,就可以适当调整weight参数使得店铺评分比weight评分更高

衰减函数(一般用于经纬度位置计算,越近距离优先度越高)

高斯衰减曲线
在这里插入图片描述
曲线解释(黑线):

offset:衰减的起始点,在该点时打分为1,实际应用中,例如offset为2km则在2km内高斯函数的打分情况都为1
origin:入参
decay:拐点打分值
scale:设置的衰减拐点值,例如设置scale为20km,则到20km时的打分为decay,大于20km之后则开始快速衰减分数。

查询dsl

 , "functions": [{"gauss": {"location": {"origin": "30.25641125.122.15246253","scale": "8km","offset": "0", "decay": 0.5}}},{"field_value_factor": {"field": "score" ,"modifier": "log2p"  }, "weight": 2}]

上述gauss设置的意思为当入参的经纬度经计算后如果距离为0,即在offset范围内,打分为1,如果距离为8km,分数为0.5,距离8km内分数衰减缓慢,8km外衰减迅速

相关度计算

影响相关度算分的参数:
1、TF(Term Frequency):词频,即单词在文档中出现的次数,词频越高,相关度越高
2、Document Frequency(DF):文档词频,即单词出现的文档数
3、IDF(Inverse Document Frequency):逆向文档词频,与文档词频相反,即1/DF。即单词出现的文档数越少,相关度越高(如果一个单词在文档集出现越少,算为越重要单词)
4、Field-length Norm:文档越短,相关度越高

"settings": {"similarity": {"my_bm25": { "type": "BM25","b":    0 }}}

在创建索引时自定义一个bm25相关度计算模型,bm25有有两个参数
1、b:默认值0.75,该值控制字段长度归一化,es底层Lucene 认为较短字段比较长字段重要性高,该参数控制长度归一化所起的作用,值越高作用越大。0完全禁用归一化
2、k1:这个参数控制着词频结果在词频饱和度中的上升速度。默认值为 1.2 。值越小饱和度变化越快,值越大饱和度变化越慢。

如果对查询的结果集感到并不满意,可以考虑以下几种方式来进行相关度的控制:

  1. boost参数调整索引或字段的权重
  2. 改变查询方式

1、bool查询
2、dis_max查询(单个最佳匹配查询)
3、function score查询
4、constant score查询(常量分值查询,一般嵌套filter使用,由于filter不进行算分,可以使用此模式指定一个固定分值)
5、boosting 查询(给不良词汇降分等)

  1. 对结果集进行rescore
  2. 更改相关度模型,使用bm25,修改k1和b的值

http://chatgpt.dhexx.cn/article/QNissrFZ.shtml

相关文章

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

目录 Elasticsearch搜索的底层原理倒排索引及其结构TF-IDF打分算法参考 Elasticsearch搜索的底层原理 ES搜索是分词后,每个字可以利用FST高速找到倒排索引的位置,并迅速获取文档id列表,大大的提升了性能,减少磁盘IO。 ES的搜索原…

详细描述一下Elasticsearch搜索的过程

详细描述一下Elasticsearch搜索的过程 我们都知道es是一个分布式的存储和检索系统,在存储的时候默认是根据每条记录的_id字段做路由分发的,这意味着es服务端是准确知道每个document分布在那个shard上的。 相对比于CURD上操作,search一个比较…

es搜索引擎

ES的优势及使用场景、ES的功能及使用简介 简介: Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数 据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。ES使用Java开发并…

ElasticSearch搜索引擎结合Mysql数据库,查询mysql数据

需要下载的东西 ElasticSearch——https://www.elastic.co/cn/downloads/elasticsearchLogstash(版本需要和ES对应)——https://www.elastic.co/cn/downloads/logstashmysql驱动jar包——https://dev.mysql.com/downloads/connector/j/ ElasticSearch 下载完ElasticSearch后…

ElasticSearch搜索引擎原理,都给你整理好了

“ 最近接触的几个项目都使用到了 Elasticsearch (以下简称 ES ) 来存储数据和对数据进行搜索分析,就对 ES 进行了一些学习。本文整理自我自己的一次技术分享。 本文不会关注 ES 里面的分布式技术、相关 API 的使用,而是专注分享下“ES 如何快速检索”这…

搜索引擎 Elasticsearch 的三大坑

搜索引擎的坑 ES 搜索引擎系列文章汇总: 一、别只会搜日志了,求你懂点原理吧 二、ES 终于可以搜到”悟空哥“了! 三、1W字|40 图|硬核 ES 实战 本文主要内容如下: 搜索引擎现在是用得越来越多了&#…

Elasticsearch搜索引擎安装使用及Java中使用

Elasticsearch(一)Docker搭建ES集群 关闭防火墙 后面我们要使用多个端口,为了避免繁琐的开放端口操作,我们关掉防火墙 # 关闭防火墙 systemctl stop firewalld.service# 禁用防火墙 systemctl disable firewalld.service安装Do…

elasticsearch搜索引擎搭建

课程作业的简单记录。 环境说明: 操作系统:windows 10Jdk:java 11Elasticsearch 7.16.0谷歌浏览器:97.0.4692.71(正式版本) (64 位) 一、目标: 1、淘宝抓取商品信息…

详解最热门搜索引擎——ES

一、产生背景 ​ 互联网发展早期的时候,对于一般的公司储存的数据量不是那么的大,所以很多公司更倾向于使用数据库去存储和查询数据,如:现在去MySQL中查询数据,大概的查询方式就是:select * from table wh…

Es搜索引擎概述和语句案例

ES概述 ES是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上,它提供了一个分布式多用户能力的搜索引擎,且ES支持RestFulweb风格的url访问。 全文检索:是指计算机索引程序通过扫描文章中的每一个词&#xf…

es之搜索详解

Elasticesearch的核心功能是搜索,现在介绍ES的搜索API及其用法。 为了有助于讲解,这里准备一些测试数据,把数据保存到文件website.json中: {"index":{"_index":"website","_id":"1…

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

uAVS2 AVS2实时编码器

测试平台  PC平台:  i7-4790K, 4.5GHz;超线程开启; 8G内存, 2400MHz。  OS:Win8.1  手机平台:  华为荣耀6。 测试序列  AVS2通测序列 测试指标 编码性能:各种preset下相对RD12.…

谁将引领新一代视频编码标准:HEVC、AVS2和AV1性能对比报告

2013年1月,新一代视频编码标准H.265/HEVC正式发布。然而它并没有像H.264那样占据市场。在这期间,AVS2、AV1等竞争者也在逐步推出,究竟谁才能引领新一代视频编码标准呢? 作者 | 李旭峰 王振宇 王荣刚 编辑 | 李旭峰 本…

关于avs和avs2编码stuffing bit的一点理解

avs和avs2编码标准关于结尾有一点和h264的不同。 比如一段视频通过avsx编码后,如果最后1位是字节对齐的(也就是说编码后的流刚好是8*n bit),那么就要在最后1bit后面再增加一字节0x80(1000 0000). 如果最后1bit没有对齐&#xff0c…

AVS2运动搜索方法简介

AVS2配置文件中有这一项: FME: 3 #Fast Motion Estimation method (1:DIA, 2:HEX,3:UMH,4:TZ) 表示采用不同的运动搜索方法,下面简单的介绍一下这几种方法。 0.ESA.全像素运动估计搜索算法(不使用) 这…

一个有趣的avs编码器(注意,是avs,而不是avs2噢)

本章附件是一个清华大学写的关于avs编解码器: https://download.csdn.net/download/weixin_43360707/87793302 该编码器遵循了stuffing bit: 打开文件夹后,如下: 可以看出这个是个跨平台的工程,提供了windows vs2015的工程文件sln&#x…

新一代视频编码标准:HEVC、AVS2和AV1性能对比报告

转自:http://media.pkusz.edu.cn/achievements/?p138 H.265/HEVC 距离H.265/HEVC标准正式发布已经有4年多的时间,虽然其压缩效率比H.264/AVC高出一倍,可以为视频公司节约带宽成本,但H.264仍是目前最流行的视频编码格式。除了复杂…

【AVS系列】AVS2参考软件RD17.0

Date: 2019-4-16 前言 AVS2标准从2017年开始批准使用,至今也有2年了,传说这个标准是对标H265,压缩效率在一些场景下的压缩率优于H.265,但是当前该标准的推广使用仍旧较少,主要用于广电和卫星电视传输。本文主要对AVS2标…

AVS2实时编码器xavs2的运行

Windows10 下 AVS2实时编码器xavs2的下载,编译,运行 xavs2的下载网址: https://gitee.com/pkuvcl/xavs2 可以选择master版本,或者tag版本,具体区别我也不太清楚,我的是1.3版本,我是下载最先的t…