一尘不染

关于ElasticSearch过滤器聚合的需求说明

json

我试图了解ElasticSearch中过滤器聚合的语法,但很困惑。文档中给出的示例是这样的:

{

  "aggs" : {

    "messages" : {

      "filters" : {

        "filters" : {

          "errors" :   { "term" : { "body" : "error"   }},

          "warnings" : { "term" : { "body" : "warning" }}

        }

      },

      "aggs" : {

        "monthly" : {

          "histogram" : {

            "field" : "timestamp",

            "interval" : "1M"

          }

        }

      }

    }

  }

}

我了解以下内容:

  • “ aggs”定义了聚合块(这是“聚合”的快捷方式)。可以看到,示例中实际上存在嵌套的聚合。
  • “消息”是聚合块的用户定义名称。
  • “错误”和“警告”是用于创建聚合“桶”的过滤器的用户定义名称。他们删除“正文”分别等于“错误”和“警告”(匹配“术语”)的项目。

我不明白的是为什么“过滤器”出现两次,嵌套在其内部。根据常规聚合语法:

"aggregations" : {

    "<aggregation_name>" : {

        "<aggregation_type>" : {

            <aggregation_body>

        }

        [,"aggregations" : { [<sub_aggregation>]+ } ]?

    }

    [,"<aggregation_name_2>" : { ... } ]*

}
  • “ ags”是“ aggregations”的缩写
  • “邮件”是我的“
  • “过滤器”是“”

第二个“过滤器”元素在做什么?在哪里记录到“过滤器”必须是自嵌套的;我正在学习的任何其他聚合似乎都不是这种情况。

感谢您的解释!


阅读 325

收藏
2020-07-27

共1个答案

一尘不染

我也了解您的感受,也去过那里:-)

filters聚合中,第一filters发生是aggregation_type,第二个是部分aggregation_body的的filters聚集和是唯一有效的key,这种聚合载体。

第二次filters出现可能被称为其他任何名称(filter_listlist等),以表示它包含用于该聚合的筛选器列表,但是ES员工选择的filters这些名称也恰好与聚合本身的名称相同。

所以它是这样的:

{
  "aggs" : {                    <--- key word to declare aggregations
    "messages" : {              <--- custom name for the aggregation that follows
      "filters" : {             <--- aggregation_type
        "filters" : {           <--- first (and only) key of the aggregation_body
          "errors" :   { "term" : { "body" : "error"   }},
          "warnings" : { "term" : { "body" : "warning" }}
        }
      },
      "aggs" : {
        "monthly" : {
          "histogram" : {
            "field" : "timestamp",
            "interval" : "1M"
          }
        }
      }
    }
  }
}
2020-07-27