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查询的场景
- 不关心词频的查询场景
- 追求查询速度同时不在乎得分的场景
好了本期的讲解也就到此结束了,如果你觉得对你的学习有帮助的话,不妨点个赞吧