根据总文档

时间:2016-03-11 11:01:59

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation

我正在使用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个文档的集群,顶级命中子分段总是返回前3个文档。 如果查询结果返回200个桶,并且只有5个正在聚合< = 3个文档,那么我只想返回5 * 3个文档,而不是200 * 3(在这种情况下Te响应为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"
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:6)

试试这个@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"
            }
          }
        }
      }
    }
  }