6

我正在使用 Elasticsearch GeoHash 网格聚合进行地图聚类。该查询平均返回 100-200 个桶。每个存储桶都使用 top_hits 聚合,我使用它为每个聚合集群返回 3 个文档。

问题是我只想在父聚合(GeoHash)聚合不超过 3 个文档时返回 top_hits。

如果一个集群聚合了超过 3 个文档,我不希望 ES 返回该集群的任何文档(因为我不会使用它们)。

我尝试使用Bucket Selector Aggregation,但未能构建正确的bucket_path。我在与 top_hits 聚合相同的级别上使用存储桶选择器聚合。一个存储桶的总文档数可在top_hits.hits.total但我得到的是reason=path not supported for [top_hits]: [hits.total].

这在弹性搜索中可能吗?这对我来说很重要,因为在大多数查询中,只有一小部分存储桶的文档少于 3 个。但是即使对于 1000 个文档的集群,top hits 子聚合也总是返回前 3 个文档。如果查询结果返回 200 个存储桶,其中只有 5 个在聚合 <= 3 个文档,那么我只想返回 5*3 个文档,而不是 200*3(在这种情况下,响应为 10MB)。

这是我的查询的 aggs 部分:

"clusters": {
  "geohash_grid": {
    "field": "coordinates",
    "precision": 3
  },
  "aggs": {
    "top_hits": {
      "top_hits": {
        "size": 3
      }
    },
    "top_hits_filter": {
      "bucket_selector": {
        "buckets_path": {
          "total_hits": "top_hits._count" // tried top_hits.hits.total
        },
        "script": {
          "inline": "total_hits <= 3"
        }
      }
    }
  }
}
4

1 回答 1

11

试试这个@ilivewithian:

  "aggs": {
    "clusters": {
      "geohash_grid": {
        "field": "coordinates",
        "precision": 3
      },
      "aggs": {
        "top_hits": {
          "top_hits": {
            "size": 3
          }
        },
        "top_hits_filter": {
          "bucket_selector": {
            "buckets_path": {
              "total_hits": "_count"
            },
            "script": {
              "inline": "params.total_hits <= 3"
            }
          }
        }
      }
    }
  }
于 2017-12-08T07:00:40.220 回答