一、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的使用场景和使用方案。