探究ES中的must和should

发布时间:2023-05-23

一、must查询

使用must查询可以筛选出同时符合多个条件的文档,相当于逻辑上的“与”操作。下面是一个例子:

POST /_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "elasticsearch" }},
        { "match": { "content": "search" }}
      ]
    }
  }
}

上述查询的意思是,要同时匹配"title"字段中包含"elasticsearch"和"content"字段中包含"search"的文档,才会被返回。 此外,must查询还可以用于排除一些文档。例如,我们可以使用must_not来筛选出不包含指定关键词的文档:

POST /_search
{
  "query": {
    "bool": {
      "must": {
        "match": { "content": "elasticsearch" }
      },
      "must_not": {
        "match": { "title": "logstash" }
      }
    }
  }
}

上述查询的意思是,要匹配"content"字段中包含"elasticsearch"并且"title"字段中不包含"logstash"的文档才会被返回。

二、should查询

使用should查询可以查找同时符合多个条件之一的文档,即逻辑上的“或”操作。下面是一个例子:

POST /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "elasticsearch" }},
        { "match": { "content": "search" }}
      ]
    }
  }
}

上述查询的意思是,要匹配"title"字段中包含"elasticsearch"或"content"字段中包含"search"的文档,都会被返回。 在should查询中,我们也可以指定一个minimum_should_match参数,表示至少要匹配多少个查询条件才会被返回。例如:

POST /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "elasticsearch" }},
        { "match": { "content": "search" }}
      ],
      "minimum_should_match": 1
    }
  }
}

上述查询的意思是,要匹配"title"字段中包含"elasticsearch"或"content"字段中包含"search"的文档,但至少要满足一个条件才会被返回。

三、must和should联合查询

在实际应用场景中,我们经常需要同时筛选出满足多个条件之一的文档,同时排除一些不符合要求的文档。这时候,就可以使用must和should联合查询,如下所示:

POST /_search
{
  "query": {
    "bool": {
      "must": {
        "match": { "content": "elasticsearch" }
      },
      "should": [
        { "match": { "title": "logstash" }},
        { "match": { "title": "kibana" }}
      ],
      "must_not": [
        { "match": { "title": "redis" }}
      ]
    }
  }
}

上述查询的意思是,要匹配"content"字段中包含"elasticsearch"并且"title"字段中至少满足一个条件,同时不匹配"title"字段中包含"redis"的文档才会被返回。

四、总结

在ES中,使用must查询可以筛选出同时符合多个条件的文档,而使用should查询可以查找同时符合多个条件之一的文档。两者结合使用,可以更加精细地组合查询条件,满足不同的实际需求。