zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Elasticsearch查询must与should不能同层级使用

elasticsearch 查询 不能 must should 层级 使用
2023-09-27 14:28:03 时间

最近,在使用es做数据查询时,用了must与should组合查询,发现should下所有条件都不满足得时候,竟然也能查询出来结果

must和should同时使用,如下例子

{
  "from": 0,
  "size": 20,
  "query": {
    "bool": {
      "must": [
        {
          "term": {"order_id": { "value": 2133456244}}
        },
        {
          "term": {"sku_id": {"value": 1000342267312}}
        }
      ],
      "should": [
        {
          "term": {"creator": {"value": "zhangsanhh"}}
        },
        {
          "terms": {"dept_id_1": [8636,4460]
        }
        }
      ]
    }
  }
}

这时候会发现,当must下的条件都满足的时候,查询结果发现没有满足should下的任何一个条件的数据也包含在结果集内,should好像最小匹配了,变得可有可无了,should失效了。这显然不是我们想要的查询结果

显然must和should不能在同一个层级使用,should必须放在must的内层且用bool包括起来。也就是一山不容二虎,要么去掉,要么被收编

修改后,如下

{
	"from": 0,
	"size": 20,
	"query": {
		"bool": {
			"must": [{
					"term": {"order_id": {"value": 2133456244}}
				},
				{
					"term": {"sku_id": {"value": 1000342267312}}
				}, {
					"bool": {
						"should": [{
								"term": {"creator": {"value": "zhangsanhh"}}
							},
							{
								"terms": {"dept_id_1": [8636, 4460]}
							}
						]
					}
				}
			]
		}
	}
}