ES重新评分rescore

简介: ES重新评分rescore

一、match和match_phrase(proximity match)的区别


1、原理区别

match --》只要简单的匹配到了一个term,就可以理解将term对应的doc作为结果返回,扫描倒排索引,扫描到了就OK。

match_phrase --》首先扫描到所有term的doc list;找到包含所有term的doc list;然后对每个doc都计算每个term的position,是否符合指定的范围;

slop,需要进行复杂的运算,来判断能否通过slop移动匹配一个doc。


2、性能对比

match query的性能比match_phrase和proximity match(有slop)要高很多,因为后两者都要计算position的距离。

match query比match_phrase的性能要高10倍,比proximity match(带slop的)性能要高20倍。

但是无须担心,ES都在几十秒到几百毫秒之间,可以接受的。


3、优化方案

一般优化思路是减少要进行proximity match搜索的document数量。

主要思路如下:

用match query先过滤出需要的数据,然后再用proximity match来根据term距离提高doc分数,同时proximity match只针对每个shard的分数排名前N个doc起作用,来重新调整他们的分数,这个过程称之为rescoring(重打分)。


默认情况下,match也许匹配了1000个doc,proximity match全都需要对每个doc进行一遍运算,判断能否slop移动匹配上,然后去贡献自己的分数,但是很多情况下,match出来也许1000个doc,其实用户大部分情况下是分页查询的,所以可能最多只会看前几页,比如一页是10条,最多也许就看5页,就是50条。

proximity match只要对前50条doc进行slop移动去匹配,去贡献自己的分数即可,不需要对全部1000个doc都去进行计算和贡献分数。


二、重新评分rescore说明


官网介绍:rescore


重新评分rescore主要是可以帮助提高查询精度,通过对第一次查询返回的顶部指定数量的索引记录进行重新打分查询,避免将开销比较大的查询匹配算法应用于索引中的所有文档,从而提高查询效率,保持查询精度。


三、使用示例


说明:

先执行开销比较小的match查询,然后通过rescore取前50条记录执行开销比较大但精度更高的match_phrase查询。


1、单次rescore

POST /_search
{
   "query" : {
      "match" : {
         "message" : {
            "operator" : "or",
            "query" : "the quick brown"
         }
      }
   },
   "rescore" : {
      "window_size" : 50,
      "query" : {
         "rescore_query" : {
            "match_phrase" : {
               "message" : {
                  "query" : "the quick brown",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }
}


2、多次rescore

POST /_search
{
   "query" : {
      "match" : {
         "message" : {
            "operator" : "or",
            "query" : "the quick brown"
         }
      }
   },
   "rescore" : [ {
      "window_size" : 100,
      "query" : {
         "rescore_query" : {
            "match_phrase" : {
               "message" : {
                  "query" : "the quick brown",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }, {
      "window_size" : 10,
      "query" : {
         "score_mode": "multiply",
         "rescore_query" : {
            "function_score" : {
               "script_score": {
                  "script": {
                    "source": "Math.log10(doc.likes.value + 2)"
                  }
               }
            }
         }
      }
   } ]
}


参数介绍:

window_size 窗口大小,默认值是from和size参数值之和,它指定了每个分片上参与二次评分的文档个数

query_weight 查询权重,默认值是1,原始查询得分与二次评分的得分相加之前将乘以改值

rescore_query_weight 二次评分查询的权重值,默认值是1,二次评分查询得分在与原始查询得分相加之前,乘以该值

rescore_mode 二次评分模式,默认为total,可用的选项有total、max、min、avg和mutiply。


total 得分是两种查询之和

max 两种查询中的最大值

min 两种查询中的最小值

avg 两种查询的平均值

multiply 两种查询的乘积


总结


本文主要介绍ES重新评分rescore的使用场景和使用方案。

目录
相关文章
|
Go API 数据库
milvus的db和collection信息查询
milvus的db和collection信息查询
1466 0
|
NoSQL Redis
Redis 之 WRONGTYPE Operation against a key holding the wrong kind of value【bug解决】
Redis 之 WRONGTYPE Operation against a key holding the wrong kind of value【bug解决】
11305 0
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
1772 0
ES自定义评分机制:function_score查询详解
|
10月前
|
并行计算 PyTorch 算法框架/工具
阿里云PAI-部署Qwen2-VL-72B
阿里云PAI-部署Qwen2-VL-72B踩坑实录
4011 1
|
Linux Docker 容器
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻。
20162 5
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
5983 1
|
存储 缓存 SpringCloudAlibaba
JUC并发编程(一):Java内存模型(JMM)及三大特性:可见性、有序性、原子性
在当今高流量、高并发的互联网业务场景下,**并发编程技术**显得尤为重要,不管是哪一门编程语言,掌握并发编程技术是个人进阶的必经之路。时隔一个半月没有写技术博客文章,有点生疏了。。。闲话少叙,接下来我将围绕并发编程知识点进行总结讲解,这里从并发编程入门开始,讲述Java内存模型和并发的三大特性。
357 1
JUC并发编程(一):Java内存模型(JMM)及三大特性:可见性、有序性、原子性
|
NoSQL Java 数据库
neo4j图数据库下载安装配置
neo4j图数据库下载安装配置
|
存储 ice 索引
经验大分享:PJSUA2开发文档
经验大分享:PJSUA2开发文档
342 0
|
存储 缓存 监控
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
557 2
下一篇
开通oss服务