当前位置: 首页 > 知识库问答 >
问题:

如果管道 aggs 查询包含筛选器,为什么它会失败?

封昊天
2023-03-14

我正在使用Elasticsearch作为数据库

我将使用聚合。


    POST new_logs/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "base.logClass.keyword": "Access"
              }
            }
          ]
        }
      },
      "size": 0, 
      "aggs": {
        "Rule1": {
          "terms": { "field": "source.srcIp" },
          "aggs": {
            "MinTime": {
              "min": { "field": "base.receiveTime" }
            },
            "MaxTime": {
              "max": { "field": "base.receiveTime" }
            }  
          }
        },
        "Rule2": {
          "filter": { "range": { "base.receiveTime": { "gte": "2022-06-22 11:27:00", "lte": "2022-06-22 11:29:00" } } 
          },
          "aggs": {
            "SubFilter": {
              "filter": { "term": { "base.subLogClass.keyword": "Login" }
              },
              "aggs": {
                "SourceIP": { 
                  "terms": { "field": "source.srcIp" },
                  "aggs": {
                      "DestinationIP": { "terms": { "field": "destination.dstIp" } 
                    }
                  }
                },
                "MinTime": {
                  "min": { "field": "base.receiveTime" }
                },
                "MaxTime": {
                  "max": { "field": "base.receiveTime" }
                }
              }
            }
          }
        },
        "Logic1": {
          "max_bucket": {
            "buckets_path": "Rule1>MinTime"
          }
        },
        "Logic2": {
          "min_bucket": {
            "buckets_path": "Rule2>SubFilter>MinTime"
          }
        }
      }
    }

正如您在查询中看到的,有两个agg-rule 1和Rule2。

Rule2正在使用过滤器aggs,而Rule1没有使用。

当我要使用流水线时,逻辑1是好的,但逻辑2失败了。

这是错误消息。


    {
      "error" : {
        "root_cause" : [
          {
            "type" : "action_request_validation_exception",
            "reason" : "Validation Failed: 1: The first aggregation in buckets_path must be a multi-bucket aggregation for aggregation [Logic2] found :org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder for buckets path: Rule2>SubFilter>MinTime;"
          }
        ],
        "type" : "action_request_validation_exception",
        "reason" : "Validation Failed: 1: The first aggregation in buckets_path must be a multi-bucket aggregation for aggregation [Logic2] found :org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder for buckets path: Rule2>SubFilter>MinTime;"
      },
      "status" : 400
    }

我不确定出了什么问题。

如果有过滤器,是否无法使用管道累积?

我向那些对Elasticsearch有丰富经验的人寻求帮助。

谢谢你的帮助。

共有1个答案

陆雨华
2023-03-14

滤波器聚合是单桶聚合。min_bucket抱怨它需要在输入路径的第一层进行多桶聚合。

您可能能够使用筛选器聚合(即多存储桶筛选器)或将筛选器聚合嵌套在 Rule1 下,因为您已经在执行这些聚合,并且可以筛选 Rule1 中的子集。

 类似资料:
  • 目前 我在DynamoDB中有一个表,其中有一个属性-主键-包含唯一的值。 问题 我希望对#B#C#(1)精确匹配和(2)包含匹配进行2次搜索,因此只需要结果: 是否可以针对主键进行这2次搜索 如果是这样,运行哪种查询最有效?e、 g.查询或扫描 注: 对于(2),我使用以下代码,但它返回DB中的所有项:

  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • GraphQL是否有可能让客户端告诉服务器,只有当某个字段不是时,它才需要该字段? 考虑到这个问题 然后,反应应该是这样的 而不是 这是否可能在不违反GraphQL规范的情况下实现?

  • 我正在尝试输出一个显示求职者对特定工作的申请的视图。到目前为止,我只能查看所有接收到的应用程序的转储,但我无法实现查询来仅查看特定作业的应用程序。即我希望能够查看每个不同空缺职务的条目。谢谢 \\ \\

  • 问题内容: 我正在编写一个PL / SQL过程,该过程需要动态生成一些查询,其中之一涉及使用来自查询的结果作为参数来创建临时表。 它可以正确编译,但是即使使用非常简单的查询,例如: IT抛出。如果我手动运行创建的查询,它将正确运行。在这一点上,我能够确定是什么导致了问题。 问题答案: 尝试丢掉“;” 从您立即执行的字符串内部。

  • 我试图在嵌套筛选器聚合中使用嵌套查询筛选器。当我这样做时,聚合返回时没有任何项。如果我将查询更改为简单的旧match_all筛选器,我确实会在bucket中获得项。 下面是我正在使用的映射的简化版本: 该查询在聚合上使用match_all筛选器: