是时候用 ES 拯救发际线啦

关于 boolean query 和 constant score query 的嵌套查询

Elasticsearch | 作者 poettian | 发布于2019年12月02日 | 阅读数:2027

Es 版本:7.4.2
 
在仔细的查阅了官方文档后,基本了解了复合查询的关键概念,包括 算分、query context、filter context。
 
但是我又从网上发现了 boolean query 和 constant score query 嵌套使用的例子并且自己也实际操作了一下,确实是可以的,这就让我比较困惑了。
 
这两个嵌套使用有没有什么语法规则?嵌套使用的话是 query context 还是 filter context?
 
可以看个例子:
 
GET /classes_test/_search
{
"size": "21",
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"match": {
"class_name": "29386556"
}
}
],
"should": [
{
"term": {
"master": "7033560"
}
},
{
"term": {
"assistant": "7033560"
}
},
{
"term": {
"students": "7033560"
}
}
],
"minimum_should_match": 1,
"must_not": [
{
"term": {
"class_id": 0
}
}
],
"filter": [
{
"term": {
"class_status": "1"
}
}
]
}
}
}
}
}

 结果如下:
 
{
"took" : 1076,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "classes_test_0",
"_type" : "_doc",
"_id" : "class_27024081_63072089",
"_score" : 1.0,
"_source" : {
"course_id" : 27024081,
"client_course_id" : 27024081,
"course_name" : "29386556",
"school_uid" : 2574554,
"course_type" : 1,
"course_stid" : 0,
"course_st_uid" : 0,
"course_btime" : 1568257200,
"course_etime" : 1568258700,
"course_status" : 1,
"expiry_time" : 1576034700,
"class_id" : 63072089,
"client_class_id" : 63072089,
"class_name" : "29386556",
"class_type" : 1,
"main_st_id" : 345545,
"main_st_uid" : 6404720,
"ass_st_id" : 0,
"ass_st_uid" : 0,
"class_btime" : 1568257200,
"class_etime" : 1568258700,
"class_status" : 1,
"students" : [
7033560
],
"audits" : [ ]
}
}
]
}
}

可以看到,_score 字段值是 1.0,这个可以说明此次查询是跳过了算分吗?但是 bool 中的 must 和 should 明明是query context啊。
 
这样嵌套使用的规则有没有一个说明呢?或者有,该去哪里去查阅呢?
 
官方文档并没有给出这两者嵌套使用的案例和说明,希望大家能给与帮助。
已邀请:

core_wzw - 某AILab搜索技术负责人

赞同来自:

因为你用filter包了它们,filter层得到的就是0/1分,constant_score默认1分,就这么简单。

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

filtet:不算分,非filter:算分。

要回复问题请先登录注册