2

ES中的Only match和bool must match query有什么区别?

一、只使用匹配查询

{
   "query":{
      "match":{
         "address":"mill"
      }
   }
}

在此处输入图像描述

二、使用复合查询

{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } }
      ]
     }
   }
}

在此处输入图像描述

你能告诉我一切吗?它们之间有什么区别?

4

2 回答 2

6

当您matchbool must子句中仅使用一个时,没有区别,当您想要组合多个(布尔)标准时,布尔子句很有用,更多信息请参阅官方 ES doc。它支持以下标准。

  1. 必须
  2. 禁止
  3. 筛选
  4. 应该

让我从你的问题中举一个小例子来说明。

只有地址和名字的索引映射

{
    "mappings": {
        "properties": {
            "address": {
                "type": "text"
            },
            "first_name" :{
                "type" : "text"
            }
        }
    }
}

索引 3 个文档,都具有相同的地址mill,但不同first_name

{
   "address" : "mill",
   "first_name" : "Johnson"
}

{
   "address" : "mill",
   "first_name" : "Parker"
}

{
   "address" : "mill",
   "first_name" : "opster"
}

搜索查询以显示所有地址mill但不得包含 first_name 作为parker

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "address": "mill"
                    }
                },
                {
                    "must_not": {
                        "first_name": "parker"
                    }
                }
            ]
        }
    }
}

结果只有 2 个地址

"hits": [
         {
            "_index": "so-60620921-bool",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.13353139,
            "_source": {
               "address": "mill",
               "first_name": "opster"
            }
         },
         {
            "_index": "so-60620921-bool",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.13353139,
            "_source": {
               "address": "mill",
               "first_name": "Johnson"
            }
         }
      ]

基于 OP 注释,提供查询和过滤上下文,详细了解性能方面。

于 2020-03-12T02:49:30.063 回答
2

正如您的问题中所写,他们将执行相同的操作。

match查询是一个非常直接的全文条件语句。

bool查询允许您添加多个字段和多个条件,例如存在(以验证在文档中找到某个字段)、should(OR 等效项)和must_not(NOT 等效项)。

再次以您的示例为例,由于bool查询只有一个must, match条件,因此它将仅返回具有该字段mill中包含的值的所有文档address

希望这有帮助!:)

于 2020-03-12T02:38:57.807 回答