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

如何在Elasticsearch中组合多个AGG?

毋琪
2023-03-14

我想计算一天内每个产品的每个IP访问计数。

一个索引中有三个参数(nginx访问日志):

  • 时间戳
  • 客户IP
  • product\u id

我知道date\u直方图可以参考https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html .

而count可以指https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html#_precision_control.

但我不知道如何组合AGG来构建脚本。

更新:

我使用下面的脚本进行搜索

GET log-nginx_access*/_search 
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "1d",
        "time_zone": "Asia/Shanghai",
        "min_doc_count": 1
      },
      "aggs": {
        "by_product": {
          "terms": {
            "field": "uri_args.product_id",
            "size": 100
          }
        },
        "aggs": {
          "by_ip": {
            "terms": {
              "field": "clientip"
            }
          }
        }
      }
    }
  }
}

获取错误:

{
  "error": {
    "root_cause": [
      {
        "type": "unknown_named_object_exception",
        "reason": "Unknown BaseAggregationBuilder [by_ip]",
        "line": 18,
        "col": 20
      }
    ],
    "type": "unknown_named_object_exception",
    "reason": "Unknown BaseAggregationBuilder [by_ip]",
    "line": 18,
    "col": 20
  },
  "status": 400
}

共有1个答案

姬天宇
2023-03-14

也许我们可以使用术语和日期直方图

裁判:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

GET /{index_name}
{  
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field" : "timestamp",
        "interval" : "day"
      },
      "aggs": {
        "by_product": {
          "terms" : {
            "field" : "product",
            "size": 100 // 100 unique products will be aggregated
          },
          "aggs": {
            "by_ip": {
              "terms" : {
                "field" : "ip"
              }
            }
          }
        }            
      }
    }
  }
}

术语聚合的响应有doc_count字段,可以满足您的要求。我们必须考虑的一件事是size参数来定义聚合的唯一性。

 类似资料:
  • 问题内容: 我想创建以下查询的等效项- 我使用必须和应该尝试了布尔查询的不同组合,但似乎没有任何效果。能做到吗? 问题答案: 这样的事情怎么样:

  • 问题内容: 我为嵌套对象具有以下索引架构: 数据如下: 现在,如果我做一些简单的查询,例如找到“ isCurrentWorkplace”为true且title.id为259的工作场所,则它可以正常工作: 现在的问题是,我需要组合这些必须子句。例如,我需要找到一条记录,其“ isCurrentWorkplace”为true,“ title.id”为259 AND “ isCurrentWorkpla

  • 问题内容: 供参考的是代码。我正在尝试制作一个记录到elasticsearch的hubot插件,然后使用hubot命令搜索那些日志。 https://gist.github.com/4050748 我正在尝试检索与两个查询匹配的记录。 我期待: 多达50条记录 具有给定用户的记录 最近一小时的记录 我有: 最多10条记录 具有给定用户的记录 从任何时候 我如何在过去一小时内获取带有某些用户名的所有

  • 我有一个elasticsearch索引用于存储关于人的信息。为了找到特定的人,我有一些查询,每个查询都单独工作,但是当我使用Bool查询将它们组合起来时,我会得到一个错误。 其中一个查询是对名称的模糊搜索 另一个查询用于搜索在特定日期范围内出生的人 现在我想组合这两个查询。我的bool查询: 虽然当我单独使用它们时,这两个查询都工作得很好,但当把它们组合起来时,我会得到一个错误。我的索引中有名字是

  • 我需要在一次测试中执行所有3个类,并满足以下要求: > 仅从Class1执行test1和test3。 仅从Class2执行test2。 执行Class3中的所有测试。 2类 3类 为此,我使用了以下testNg xml,但无论我是否包含该组,都将执行Class 1和Class 3中的所有测试。 如果我希望执行上述类文件,请建议TestNg xml文件的正确语法。

  • 我有很多海面温度NetCDF文件,具有相同的纬度和纬度,但时间变量不同。我想尝试通过组合时间变量将其组合成一个NetCDF文件,因为每个NetCDF文件中的时间变量是连续的 有没有更有效的方法?因为在CDO(气候数据操作员)中,我无法进行循环 下面是我使用的文件名的一个例子 带模式sstdas_(年)(月)(dekad)