ES 自定义打分(上)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: ES 自定义打分

ES 自定义打分

Elasticsearch 会为 query 的每个文档计算一个相关度得分 score ,并默认按照 score 从高到低的顺序返回搜索结果。 在很多场景下,我们不仅需要搜索到匹配的结果,还需要能够按照某种方式对搜索结果重新打分排序。例如:

搜索具有某个关键词的文档,同时考虑到文档的时效性进行综合排序。搜索某个旅游景点附近的酒店,同时根据距离远近和价格等因素综合排序。搜索标题包含 elasticsearch 的文章,同时根据浏览次数和点赞数进行综合排序。

Function score query 就可以让我们实现对最终 score 的自定义打分。


score 自定义打分过程

为了行文方便,本文把 ES 对 query 匹配的文档进行打分得到的 score 记为 query_score ,而最终搜索结果的 score 记为 result_score ,显然,一般情况下(也就是不使用自定义打分时),result_score 就是 query_score

那么当我们使用了自定义打分之后呢?最终结果的 score 即 result_score 的计算过程如下:

1.跟原来一样执行 query 并且得到原来的 query_score2.执行设置的自定义打分函数,并为每个文档得到一个新的分数,本文记为 func_score3.最终结果的分数 result_score 等于 query_scorefunc_score 按某种方式计算的结果(默认是相乘)。

例如,搜索标题包含 elasticsearch 的文档。

不使用自定义打分,则搜索形如:

GET /_search
{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}

假设我们最终得到了三个搜索结果,score 分别是 0.3、0.2、0.1

使用自定义打分,即 function_score ,则语法形如:

GET /_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": "elasticsearch"
        }
      }
      <!-- 设置自定义打分函数,这里先省略,后面再展开讲解 -->
      "boost_mode": "multiply"
    }
  }
}

最终搜索结果 score 的计算过程就是:

1.执行 query 得到原始的分数,与上文假设对应,即 query_score 分别是 0.3、0.2、0.12.执行自定义的打分函数,这一步会为每个文档得到一个新的分数,假设新的分数即 func_score 分别是 1、3、53.最终结果的 score 分数即 result_score = query_score * func_score ,对应假设的三个搜索结果最终的 score 分别就是 0.3 * 1 = 0.30.2 * 3 = 0.60.1 * 5 = 0.5 ,至此我们完成了新的打分过程,而搜索结果也会按照最终的 score 降序排列。

最终的分数 result_score 是由 query_scorefunc_score 进行计算而来,计算方式由参数 boost_mode 定义:

multiply : 相乘(默认),result_score = query_score * function_scorereplace : 替换,result_score = function_scoresum : 相加,result_score = query_score + function_scoreavg : 取两者的平均值,result_score = Avg(query_score, function_score)max : 取两者之中的最大值,result_score = Max(query_score, function_score)min : 取两者之中的最小值,result_score = Min(query_score, function_score)

本文读到这,你应该已经对自定义打分的过程有了一个基本印象(query 原始分数、自定义函数得分、最终结果 score )。但是我们还有一个关键点没讲,即怎么设置自定义打分函数?


function_score 打分函数

function_score 提供了以下几种打分的函数:

weight : 加权。random_score : 随机打分。field_value_factor : 使用字段的数值参与计算分数。decay_function : 衰减函数 gauss, linear, exp 等。script_score : 自定义脚本。

weight

weight 加权,也就是给每个文档一个权重值。

示例:

{
  "query": {
    "function_score": {
      "query": { "match": { "message": "elasticsearch" } },
      "weight": 5
    }
  }
}

例子中的 weight 是 5 ,即自定义函数得分 func_score = 5 ,最终结果的 score 等于 query_score * 5 。

当然这个示例将匹配项全部加权并不会改变搜索结果顺序,我们再看一个例子:

{
  "query": {
    "function_score": {
      "query": { "match": { "message": "elasticsearch" } },
      "functions": [
        {
          "filter": { "match": { "title": "elasticsearch" } },
          "weight": 5
        }
      ]
    }
  }
}

我们可以通过 filter 去限制 weight 的作用范围,另外我们可以在 functions 中同时使用多个打分函数。

random_score

random_score 随机打分,生成 [0, 1) 之间均匀分布的随机分数值。

示例:

GET /_search
{
  "query": {
    "function_score": {
      "random_score": {}
    }
  }
}

虽然是随机值,但是有时候我们需要随机值保持一致,比如所有用户都随机产生搜索结果,但是同一个用户的随机结果前后保持一致,这时只需要为同一个用户指定相同的 seed 即可。

示例

{
  "query": {
    "function_score": {
      "random_score": {
        "seed": 10,
        "field": "_seq_no"
      }
    }
  }
}


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
6月前
|
消息中间件 Java 测试技术
RocketMQ实战—7.生产集群部署和生产参数
本文详细介绍了RocketMQ生产集群的部署与调优过程,包括集群规划、环境搭建、参数配置和优化策略。
RocketMQ实战—7.生产集群部署和生产参数
|
Shell
mac 使用code命令打开VSCode
我们在mac的终端可以使用 open .打开文件夹 如果我们想用vs-code打开文件夹,用的命令是 code .,不过你得先按照code 安装code:打开VSCode –> command+shift+p –> 输入shell command –...
5377 0
|
8月前
|
应用服务中间件 PHP nginx
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
简介: 本教程介绍如何基于 Dragonwell 的 Ubuntu 镜像创建一个运行 Nginx 的 Docker 容器。首先从阿里云容器镜像服务拉取基础镜像,然后编写 Dockerfile 确保 Nginx 作为主进程运行,并暴露 80 端口。最后,在包含 Dockerfile 的目录下构建自定义镜像并启动容器,确保 Nginx 在前台运行,避免容器启动后立即退出。通过 `docker build` 和 `docker run` 命令完成整个流程。
300 25
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
1730 0
ES自定义评分机制:function_score查询详解
|
10月前
|
存储 前端开发 Java
【SpringMVC】应用分层
本文介绍了项目在实现中如何进行应用分层,比较了前后端分离三层架构和MVC三层架构
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
资源调度 前端开发 搜索推荐
使用Tailwind CSS构建响应式布局
【10月更文挑战第1天】使用Tailwind CSS构建响应式布局
|
数据采集 人工智能 安全
阿里云Elasticsearch 企业级AI搜索方案发布
本文从AI搜索落地的挑战、阿里云在RAG场景的实践、效果提升三个方面,深度解读阿里云Elasticsearch 企业级AI搜索方案。
975 8
|
分布式计算 Hadoop 分布式数据库
Hadoop学习笔记(HDP)-Part.16 安装HBase
本文为HDP大数据平台部署系列教程第十六篇,详细介绍HBase的安装与配置。涵盖HMaster高可用设置、Ranger权限管理、表空间与表操作等核心内容,并提供Kerberos认证下的常用命令示例,助力构建安全高效的分布式数据库环境。
287 0
|
缓存 Java 容器
【Zookeeper】Apach Curator 框架源码分析:初始化过程(一)【Ver 4.3.0】(2)
【Zookeeper】Apach Curator 框架源码分析:初始化过程(一)【Ver 4.3.0】
315 0
【Zookeeper】Apach Curator 框架源码分析:初始化过程(一)【Ver 4.3.0】(2)