当前位置: 首页 > 面试题库 >

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

傅越
2023-03-14
问题内容

我试图了解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”的缩写
  • “邮件”是我的“
  • “过滤器”是“”

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

感谢您的解释!


问题答案:

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

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"
          }
        }
      }
    }
  }
}


 类似资料:
  • 问题内容: 我想过滤出字段“ A”等于“ a”的文档,并且我想同时考虑字段“ A”,当然不包括先前的过滤器。我知道您可以将过滤器“置于查询之外”,以便在不应用该过滤器的情况下获得构面,例如: elasticsearch 单反 这非常好,但是如果我有多个滤镜和构面,每个滤镜和构面应该互相排斥,会发生什么?例: 也就是说,对于方面AI,希望保留除A:a以外的所有过滤器,对于方面B希望保留除B:b以外的

  • 我有一个返回一组文档(100)的查询。我想对这些应用一个聚合,因为这些是最相关的。当我尝试聚合时,它返回所有结果的聚合,而不是前100个结果的聚合。

  • 问题内容: 我对Elasticsearch世界真的很陌生。 比方说,我有两个字段嵌套聚集:与: 这段代码可以完美地工作,并且给我这样的东西: 现在,我需要排除所有小于1000的聚合结果,而改为: 是否可以在查询正文中设置此需求?还是我必须在调用者布局中执行过滤器(在我的情况下为javascript)? 提前致谢 问题答案: 下次,M’sieur Toph’:RTFM! 我真的很傻:问了30秒后,我

  • 问题内容: 我要实现的目标:我不希望查询过滤器过滤“年龄”聚合,并且希望能够对其应用过滤器。 因此,如果我从以下查询开始: 我的聚合“ young_age”将同时被filter_1和filter_2过滤。我不希望我的汇总被filter_1过滤。 在查看文档时,我认为全局聚合可以解决我的问题,因此我编写了以下查询: 但是然后elasticsearch抱怨我的filter_2: “”“在[global

  • 不知道如何表达这个问题。我正在使用Elasticsearch 2.2。 让我们从数据集的一个示例开始,该数据集由5个文档组成: 被调用的\u实体始终具有uuid。coverage\u实体可以为空,也可以具有uuid。 我使用脚本在任何一个被调用的\实体上进行聚合。uuid或coverage\u实体。uuid: 现在,聚合已经从任一头生成了术语。调用了\u实体。uuid或标头。coverage\u实

  • 我有一个Elasticsearch文档索引,其中有一个包含URL列表的字段。如预期的那样,在该字段上聚合会给我唯一URL的计数。 然后,我想过滤掉其键不包含特定字符串的桶。我已经尝试使用Bucket选择器聚合来实现这一点。 此尝试: 失败原因: 名为[links\u key\u filter]且类型为[bucket\u selector]的管道聚合无效。顶层仅允许同级管道聚合 将bucket选择器