【问题标题】:Check multiple fields exists检查多个字段是否存在
【发布时间】:2025-12-24 07:05:06
【问题描述】:

The Elasticsearch Query DSL 允许我查找存在特定字段的文档:

GET /_search
{
    "query": {
        "exists" : { "field" : "firstname" }
    }
}

但似乎只有一个字段存在,如何检查是否存在 2 个字段?例如,我想查找同时存在firstnamelastname 字段的用户。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以通过将两个存在包装在filter 子句或must 子句中来做到这一点,如下所示:

    {
      "query": {
        "bool": {
          "filter": [
            {
              "exists": {
                "field": "firstname"
              }
            },
            {
              "exists": {
                "field": "lastname"
              }
            }
          ]
        }
      }
    }
    

    filter 子句中使用将得到与must 子句相同的输出。唯一的区别是带有过滤器的将不计算分数,而带有必须的将计算分数。根据您的需要使用。有关此内容的更多信息,请阅读 this

    使用必须:

    {
      "query": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "firstname"
              }
            },
            {
              "exists": {
                "field": "lastname"
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 我认为使用过滤器会更快,对吗?
    • @Kourosh 是的,过滤器会更快,因为它不需要计算分数。
    • 感谢您的确认!