Elastic: 常量分数查询constand_score query应用场景

简介: 最近正好有同学问到constand score查询与其他查询的区别,趁此机会,我们来详细了解下constant score查询

0. 引言

最近正好有同学问到constand score查询与其他查询的区别,趁此机会,我们来详细了解下constant score查询

1. 定义

首先我们先来看官方文档中对constand score查询的介绍
在这里插入图片描述
可以看到官方解释是:constant score是用来包装filter查询的,其相关性得分等于boost参数值

这个解释听起来有些生硬,我们来翻译一下:

  • constant score是组合filter来使用的,也就是说constant score中是不能使用query查询的,我们知道filter是不会计算相关性得分的,filter会缓存查询结果来提高查询效率
  • 相关性得分是个常量,等于boost参数值,默认是1

关于这两点我们用一个例子来向大家展示

测试数据:

PUT movies2/_bulk
{"index":{"_id":1}}
{"title": "you and me","tags":["romantic comedy","Action"]}
{"index":{"_id":2}}
{"title": "you and me","tags":["romantic comedy","romantic comedy"]}
{"index":{"_id":3}}
{"title": "you and me","tags":["romantic comedy romantic comedy","Action"]}

执行constant score查询

GET movies2/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "constant_score": {
            "filter": {
              "match_phrase":{
                "tags": "romantic comedy"
              }
            },
            "boost": 2
          }
        }
      ]
    }
  }
}

查询结果:从查询结果可以看出,其相关性得分是个固定值,也就是我们设置的boost。同时因为filter没有考虑相关性得分,tags字段中出现romantic comedy更多的,更加符合查询题意的id=2数据并没有被排在前面
在这里插入图片描述

2. 案例分析

下面我们基于上述的索引数据来通过一个案例,这个题也是ECE考试中的真题,来带大家体会constant score查询。

案例:

  • 查询movies2索引中tittle字段包含my或者me的数据
  • 如果数据中包含romantic comedy则将其相关性得分提高

我们尝试用constant score来解这道题

GET movies2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "me my"
          }
        }
      ],
      "should": [
        {
          "constant_score": {
            "filter": {
              "match_phrase":{
                "tags": "romantic comedy"
              }
            },
            "boost": 2
          }
        }
      ]
    }
  }
}

执行结果:

  • 会看到排在最前面的是id=1,id=2的数据,他们虽然有小数位的得分,但实际上是must查询的得分+constant score的2分
  • 包含romantic comedy的数据确实被排到最前面,但是这样的结果是我们想要的吗?题目是要求包含romantic comedy的得分提高,同时因为tags字段是个数组,那么我们是不是可以理解为,数组越多元素包含romantic comedy越好。
  • 但实际上,tags中有两个元素包含romantic comedy的id=2数据得分并没有更多

在这里插入图片描述

我们使用普通的match_phrase来解题

GET movies2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "me my"
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "tags": {
              "query": "romantic comedy",
              "boost": 2
            }
          }
        }
      ]
    }
  }
}

执行结果:

  • 可以看到包含romantic comedy更多的id=2,id=3的数据的得分都更高,更加符合我们的题意
  • 所以此题是不适合用constant score来解的

在这里插入图片描述

3. constant score应用场景

基于上述定义,constant score更加适合

  • bool查询中只包含filter查询的场景
  • 不关心词频的查询场景
  • 追求查询速度同时不在乎得分的场景

好了本期的讲解也就到此结束了,如果你觉得对你的学习有帮助的话,不妨点个赞吧

关注公众号:Elasticsearch之家,了解更多新鲜内容

在这里插入图片描述

目录
相关文章
|
关系型数据库 PostgreSQL
PostgreSQL listagg within group (order by) 聚合兼容用法 string_agg ( order by) - 行列变换,CSV构造...
标签 PostgreSQL , order-set agg , listagg , string_agg , order 背景 listagg — Rows to Delimited Strings The listagg function transforms values from a g...
6221 0
|
7月前
|
存储 Serverless 定位技术
深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析
深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析
158 0
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
1338 0
ES自定义评分机制:function_score查询详解
|
人工智能 Java
Elasticsearch:使用 function_score 中的weight和gauss衰减函数定制搜索结果的分数
Elasticsearch:使用 function_score 中的weight和gauss衰减函数定制搜索结果的分数
|
缓存 自然语言处理 数据挖掘
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
110 0
|
SQL 监控 数据库
网站流量日志分析--统计分析--分组 topN--row_number over 函数使用|学习笔记
快速学习网站流量日志分析--统计分析--分组 topN--row_number over 函数使用
271 0
网站流量日志分析--统计分析--分组 topN--row_number over 函数使用|学习笔记
|
消息中间件 NoSQL API
数据类型-sorted_set 带有权重的任务管理 | 学习笔记
快速学习数据类型-sorted_set 带有权重的任务管理
DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
|
缓存 算法 搜索推荐
【Elastic Engineering】Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数
Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数
671 0
【Elastic Engineering】Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数