ElasticSearch 8.0脚本评分查询

2023-11-08

使用脚本来提供返回的文档的自定义评分

script_score查询非常有用,例如:评分函数成本比较高且我们仅仅需要计算一组过滤后的文档的评分。

请求的样例:

下面的script_score查询设置每个返回的文档的评分等于my-int字段值除以10

GET /_search
{
  "query": {
    "script_score": {
      "query": {
        "match": { "message": "elasticsearch" }
      },
      "script": {
        "source": "doc['my-int'].value / 10 "
      }
    }
  }
}

script_score的顶级参数:

query:必须存在,定义查询对象,用于查询需要返回的文档

script:必须存在,定义脚本对象,脚本用于计算查询返回的文档的评分

(备注:通过script_score查询计算的相关评分不能是负数,为了支持特定的查询优化,Lucene要求评分必须是正数或者0)

min_score:可选,浮点型数值,当文档的评分低于此值的时候,将会被从搜索的结果中排除

boost:可选,浮点型数值,脚本生成的文档分数乘以此值生成最终文档分数。默认值为1.0

注意事项:

在脚本里面使用相关性评分

     可以在脚本里面使用_score变量来获取当前文档的相关性评分

预定义函数

     我们可以在脚本里面使用任何可用的painless函数,也看有使用下列的预定义函数来自定义评分:

  • Saturation
  • Sigmoid
  • Random score function
  • Decay functions for numeric fields
  • Decay functions for geo fields
  • Decay functions for date fields
  • Functions for vector fields

官方建议使用这些预定义函数而不是我们自己来写,这些函数ES官方进行了相关优化。

Saturation

saturation(value,k) = value/(k + value)

"script" : {
    "source" : "saturation(doc['my-int'].value, 1)"
}

Sigmoidedit
sigmoid(value, k, a) = value^a/ (k^a + value^a)

"script" : {
    "source" : "sigmoid(doc['my-int'].value, 2, 1)"
}

随机评分函数

random_score函数生成从0到但不包括1的均匀分布分数。

random_score函数遵循这样的语法:randomScore(<seed>, <fieldName>)。seed是必须要有的参数,seed是一个整数值,filedName是一个可选参数,是字符型参数。

"script" : {
    "source" : "randomScore(100, '_seq_no')"
}

如果filedName参数没有设置,则在内部,Lucene文档的id将会被使用。这将会非常高效,但不幸的是,由于文档可能会被合并重新编号,因此无法复用。

"script" : {
    "source" : "randomScore(100)"
}

需要注意的是,位于同一分片中且字段值相同的文档将获得相同的分数,因此通常需要使用一个字段,该字段对整个分片中的所有文档都具有唯一的值。一个好的默认选择可能是使用_seq_no字段,它唯一的缺点是,如果文档被更新,分数将发生变化,因为更新操作也会更新_seq_no字段的值。

数值字段的衰减函数

  • double decayNumericLinear(double origin, double scale, double offset, double decay, double docValue)
  • double decayNumericExp(double origin, double scale, double offset, double decay, double docValue)
  • double decayNumericGauss(double origin, double scale, double offset, double decay, double docValue)
"script" : {
    "source" : "decayNumericLinear(params.origin, params.scale, params.offset, params.decay, doc['dval'].value)",
    "params": { 
        "origin": 20,
        "scale": 10,
        "decay" : 0.5,
        "offset" : 0
    }
}

备注:脚本只会编译一次,即使后续params会改变。

GEO字段的衰减函数

  • double decayGeoLinear(String originStr, String scaleStr, String offsetStr, double decay, GeoPoint docValue)
  • double decayGeoExp(String originStr, String scaleStr, String offsetStr, double decay, GeoPoint docValue)
  • double decayGeoGauss(String originStr, String scaleStr, String offsetStr, double decay, GeoPoint docValue)
"script" : {
    "source" : "decayGeoExp(params.origin, params.scale, params.offset, params.decay, doc['location'].value)",
    "params": {
        "origin": "40, -70.12",
        "scale": "200km",
        "offset": "0km",
        "decay" : 0.2
    }
}

date字段的衰减函数

  • double decayDateLinear(String originStr, String scaleStr, String offsetStr, double decay, JodaCompatibleZonedDateTime docValueDate)
  • double decayDateExp(String originStr, String scaleStr, String offsetStr, double decay, JodaCompatibleZonedDateTime docValueDate)
  • double decayDateGauss(String originStr, String scaleStr, String offsetStr, double decay, JodaCompatibleZonedDateTime docValueDate)
"script" : {
    "source" : "decayDateGauss(params.origin, params.scale, params.offset, params.decay, doc['date'].value)",
    "params": {
        "origin": "2008-01-01T01:00:00Z",
        "scale": "1h",
        "offset" : "0",
        "decay" : 0.5
    }
}

备注:日期衰减函数仅仅支持默认的日期格式和默认的时区,此外,不支持使用 now进行计算。

向量类型的函数:

CSDN

开启耗时的脚本查询

如果search.allow_expensive_queries参数被设置为false,则脚本查询不会被执行。

执行计划:

通过explain请求可以看到评分是如何计算的。

script_score查询可以通过设置explanation参数来查看它的执行计划:

GET /my-index-000001/_explain/0
{
  "query": {
    "script_score": {
      "query": {
        "match": { "message": "elasticsearch" }
      },
      "script": {
        "source": """
          long count = doc['count'].value;
          double normalizedCount = count / 10;
          if (explanation != null) {
            explanation.set('normalized count = count / 10 = ' + count + ' / 10 = ' + normalizedCount);
          }
          return normalizedCount;
        """
      }
    }
  }
}

执行_search请求时explanation 的值是null,为了避免出现空指针的情况,需要增加一下判断。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch 8.0脚本评分查询 的相关文章

随机推荐

  • 两个链式存储的一元多项式乘法运算算法

    include
  • 面试官:说说Node中的EventEmitter? 如何实现一个EventEmitter?

    一 是什么 我们了解到 Node采用了事件驱动机制 而EventEmitter就是Node实现事件驱动的基础 在EventEmitter的基础上 Node几乎所有的模块都继承了这个类 这些模块拥有了自己的事件 可以绑定 触发监听器 实现了异
  • 电赛知识补充——电机篇

    在准备电赛的时候 我通常会发现手边有很多格式各样的电机 问了很多人都没能和我说明白这些个电机是什么 有什么特性 怎么驱动 所以我打算学习一下电机的分类 本文主要记录了在电赛中所需要的电机相关知识 包括电机的种类 特点 驱动方式等等 今后不定
  • windows7 64位机上安装配置CUDA 9.1+cudnn7操作步骤

    版权声明 本文为CSDN博主 陌筱北 的原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net moxiaobeiMM article details 84529
  • vue项目整合codemirror代码编辑器

    需求 需要在web页面中整合一个sql的编辑器 选择了codemirror 以下被我封装成了组件 项目里改一改就可以直接用 codemirror支持很多语言 但我只需要使用sql编辑器 所以做了精简 安装使用步骤 1 安装 npm i co
  • 【经典】MySQL绿色安装

    第一步 下载Mysql 官网下载地址 https dev mysql com downloads mysql 1 鼠标滑下来 找到Other Download中的 Windows x86 64 bit ZIP Archive 点击其右边的D
  • 真实图形学(光照模型)

    一 颜色模型 真实感图形学 简单地说 就是希望用计算机生成像照相机拍的照片一样逼真的图形图像 要实现这个目标 需要三部曲 第一步 建立三维场景 建模 第二步 消隐解决物体深度的显示及确定物体之内的相互关系 第三步 在解决了消隐问题之后 在可
  • 机器学习模型常用评价指标(Accuracy, Precision, Recall、F1-score、MSE、RMSE、MAE、R方)

    前言 众所周知 机器学习分类模型常用评价指标有Accuracy Precision Recall和F1 score 而回归模型最常用指标有MAE和RMSE 但是我们真正了解这些评价指标的意义吗 在具体场景 如不均衡多分类 中到底应该以哪种指
  • 使用RocketMQ如何保证消息顺序

    RocketMQ 的顺序问题分为 全局有序和局部有序 全局有序 整个 RocketMQ 系统的所有消息严格按照队列先入先出顺序进行消费 局部有序 只保证一部分关键消息的消费顺序 在通常的业务场景中 我们只需要能够保证局部有序就可以了 电商订
  • Unity 接入Facebook。登录、分享、邀请、好友列表等功能。详细记录

    本文现已搬迁至 https blog csdn net NRatel article details 84241100 此博客废弃 我的新CSDN账号 https blog csdn net NRatel
  • 微云不限速下载

    既然将百度网盘有不限速的下载 那么腾讯也有 现在分享给大家 这里以PC端为例 准备工具 微云客户端 QQ 将文件保存到自己的微云上 打开QQ随便找个好友或者给自己发消息 直接发到我的设备也可以 然后鼠标放到文件夹的图标 选择微云文件 然后直
  • element-ui的表格超出部分显示省略号

    前言 element ui的表格超出部分显示省略号 这里实际是官方有提供的属性 show overflow tooltip 使用 注意在哪一行需要显示省略号 就给那个表头加 官方api Table Attributes 参数 说明 类型 可
  • 天梯赛习题集 L 1 - 016 查验身份证 (15 分)

    一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 然后将计算的和对11取模得到值Z 最
  • Uabntu 17.04+python2.7 +anaconda2

    Uabntu 17 04 python2 7 anaconda2 python 2 7 安裝 安裝外部庫 網絡問題 安裝 pip apt get Anacoda2 使用 電腦白癡的ubantu python之路 python 2 7 安裝
  • 在linux里rm 命令怎么删除多个文件

    dilantaya 说 请问在linux里rm 命令怎么删除多个文件 比如 大量的 2010 10 xx log 和 2010 09 xx log 文件 用rm命令怎么一起给删除了 谢谢 chenyx 说 用 代替xx就能删除了 例如 rm
  • cmake使用TOOLCHAIN进行交叉编译

    cmake DCMAKE TOOLCHAIN FILE toolchain RK3399 cmake CMAKE INSTALL PREFIX usr local rk3399mpp 创建toolchain RK3399 cmake文件 c
  • View事件分发相关面试题

    1 View事件分发机制 对屏幕的点击 滑动 抬起等一系的动作都是由一个一个MotionEvent对象组成的 根据不同动作 主要有以下三种事件类型 ACTION DOWN 手指刚接触屏幕 按下去的那一瞬间产生该事件 ACTION MOVE
  • STL 中排序相关算法总结

    sort 头文件 sort 算法定义在头文件 include 中 算法作用 sort 算法是基于快速排序实现的 默认对指定范围内的元素进行升序排列 使用条件 使用 sort 进行排序到容器必须支持随机访问 默认使用 lt 运算符进行比较 也
  • CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

    CNN 卷积神经网络 RNN 循环神经网络 DNN 深度神经网络 的内部网络结构有什么区别 CNN 卷积神经网络 RNN 循环神经网络 DNN 深度神经网络 的内部网络结构有什么区别 以及他们的主要用途是什么 只知道CNN是局部感受和参数共
  • ElasticSearch 8.0脚本评分查询

    使用脚本来提供返回的文档的自定义评分 script score查询非常有用 例如 评分函数成本比较高且我们仅仅需要计算一组过滤后的文档的评分 请求的样例 下面的script score查询设置每个返回的文档的评分等于my int字段值除以1