【问题标题】:Filter documents prior to bucketing using GeoTile Aggregation in Elasticsearch在 Elasticsearch 中使用 GeoTile Aggregation 在分桶之前过滤文档
【发布时间】:2021-04-09 18:50:21
【问题描述】:

我正在寻找一个在通过 GeoTile 聚合进行分桶之前过滤文档的示例。例如,我想要一个存储桶来保存某个值大于 x 的文档数量。任何指针将不胜感激。现在我有:

{
    "aggs": {
        "avg_my_field": {
            "avg": {
                "field": "properties.my_field"
            }
        },
        "aggs": {
            "large-grid": {
                "geotile_grid": {
                    "field": "coordinates",
                    "precision": 8
                }
            }
        }
    }
}

我不知道从这里去哪里。任何指针将不胜感激。

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    只需添加一个顶级filter aggregation

    在伪代码中:

    POST /your-index/_search
    {
      aggs: 
        filter_agg_name:
           filter:
              ...actual filters
           aggs:
              ...the rest of your aggs 
    }
    

    应用于您的特定用例:

    POST _search
    {
      "aggs": {
        "my_applicable_filters": {
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "some_numeric_or_date_field": {
                      "gte": 42
                    }
                  }
                }
              ]
            }
          },
          "aggs": {
            "avg_my_field": {
              "avg": {
                "field": "properties.my_field"
              }
            },
            "large-grid": {
              "geotile_grid": {
                "field": "coordinates",
                "precision": 8
              }
            }
          }
        }
      }
    }
    

    请注意,您的原始聚合查询在语法上不正确。你很亲密,但请记住:

    1. 一些聚合可以有以下形式的直接子(子聚合):

    POST /your-index/_search
    {
      aggs: 
        top_level_agg_name:
           agg_type:
              ...agg_def
           aggs:
              1st_child_name:
                 ...1st_child_defs
              2nd_child_name:
                 ...2nd_child_defs
              ...
    }
    

    我说一些是因为avg聚合支持子聚合(因为it's not a bucket aggregation)。这就是我改用以下内容的原因:

    2。在单个请求中指定时,聚合可以独立运行:

    POST /your-index/_search
    {
      aggs: 
        some_agg_name:
           agg_type:
              ...agg_def
        other_agg_name:   
           agg_type:
              ...agg_def
        ...
    }
    

    这样,您可以同时获得properties.my_field 的平均值和地理集群您的coordinates


    相反,当您意识到geotile_grid 确实是一个能够接受子聚合的bucket 聚合时,您可以首先按相应的地理哈希对您的文档进行分组,然后然后 计算平均值。现在想来,这可能是你的初衷?。

    谈到清晰的时刻,您可以在我最近发布的Elasticsearch Handbook 中了解很多关于aggregations 相互关联的信息。

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2016-12-04
      • 2014-11-17
      • 2016-09-18
      • 2017-02-15
      • 2014-01-02
      相关资源
      最近更新 更多