关于 boolean query 和 constant score query 的嵌套查询
Elasticsearch | 作者 poettian | 发布于2019年12月02日 | 阅读数:2644
								Es 版本:7.4.2
 
在仔细的查阅了官方文档后,基本了解了复合查询的关键概念,包括 算分、query context、filter context。
 
但是我又从网上发现了 boolean query 和 constant score query 嵌套使用的例子并且自己也实际操作了一下,确实是可以的,这就让我比较困惑了。
 
这两个嵌套使用有没有什么语法规则?嵌套使用的话是 query context 还是 filter context?
 
可以看个例子:
 
结果如下:
 
可以看到,_score 字段值是 1.0,这个可以说明此次查询是跳过了算分吗?但是 bool 中的 must 和 should 明明是query context啊。
 
这样嵌套使用的规则有没有一个说明呢?或者有,该去哪里去查阅呢?
 
官方文档并没有给出这两者嵌套使用的案例和说明,希望大家能给与帮助。
																				在仔细的查阅了官方文档后,基本了解了复合查询的关键概念,包括 算分、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啊。
这样嵌套使用的规则有没有一个说明呢?或者有,该去哪里去查阅呢?
官方文档并没有给出这两者嵌套使用的案例和说明,希望大家能给与帮助。

 
	
2 个回复
core_wzw - 某AILab搜索技术负责人
赞同来自:
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自: