【问题标题】:Elastic Search aggregation find if a field exist in all records弹性搜索聚合查找所有记录中是否存在字段
【发布时间】:2022-02-22 22:06:24
【问题描述】:

我在 Elastic Search 上有一个索引,大多数记录都有字段 foo,有些可能没有。

我想通过聚合了解所有记录是否都有字段foo

案例一:

id = 0, foo = 1, bar = 1

进行这样的聚合会给我fooContainsNull = false,因为所有记录都包含foo

案例2:

id = 0, foo = 1, bar = 1
id = 1, bar = 1

进行这样的聚合会给我fooContainsNull = true,因为其中一条记录(id = 1)没有foo

我尝试使用过滤聚合

    "aggregations": {
        "fooContainsNull": {
          "filter": {
            "bool": {
              "not": {
                "exists": {
                  "field": "foo"
                }
              }
            }
          }
        }
    }

但是boolnot 似乎不能一起使用。

如何使用 Elastic Search 聚合来实现这一点?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    not 替换为must_not

    "aggregations": {
            "fooContainsNull": {
              "filter": {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "foo"
                    }
                  }
                }
              }
            }
        }
    

    这将为您提供没有字段 foofooContainsNull 的文档数量。因此,您可以通过检查此数字是 0 还是大于 0 来构建逻辑。

    【讨论】:

      【解决方案2】:

      甚至更好

      aggs: {
        aggregationName: {
          missing: {
            field: 'fieldName'
          }
        }
      }
      

      【讨论】:

      • 为什么会更好?
      • @JeremyCaney 因为它更干净
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      相关资源
      最近更新 更多