ElasticSearch中是否存在“Post-Aggregation”方法

时间:2017-04-30 12:34:35

标签: elasticsearch aggregation

我正在尝试在我的群集上运行一些统计信息。

有时我无法检索一个索引(或一种类型)范围内的所有文档,因为它有大量的数据流量。所以我对我的查询设置了一些限制(例如:"size": 1000)。

结合聚合范围,我在命中范围内获得了1000个文档,并且索引中所有匹配文档的聚合结果

这种行为是可以理解的,但由于我的统计数据的性质,我想只聚合实际检索的文档。

我知道在查询范围内有一个名为“Post-Filtering”的方法会在 计算聚合后发生。

所以,我正在搜索的是一些'后聚合',在> 文件被检索之后发生,因此只有那些被检索的文档才会聚合。

以下是一些查询示例:

{
  "size": 1000,
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "make": "ford"
              }
            }
          ]
        }
      }
    }
  },
  "aggregations": {
    "types": {
      "terms": {
        "field": "color"
      }
    }
  }
}

在上面的查询中,我想仅在那1000个检索到的文档上获得聚合结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

  

我想仅在这1000个检索到的文档上获得聚合结果。

简答:使用Sampler aggregation

答案很长:您可以从每个分片中获得最高 N

鉴于您的疑问:

{
  "size": 1000,
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "make": "ford"
              }
            }
          ]
        }
      }
    }
  },
  "aggregations": {
    "types": {
      "terms": {
        "field": "color"
      }
    }
  }
}

添加Sampler后,聚合将如下所示:

{
    "size": 1000,
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [{
                        "term": {
                            "make": "ford"
                        }
                    }]
                }
            }
        }
    },
    "aggregations": {
        "sample": {
            "sampler": {
                "shard_size": 200
            },
            "aggs": {
                "types": {
                    "terms": {
                        "field": "color"
                    }
                }
            }
        }
    }
}

注意"shard_size": 200 - 默认值为100.如果您有5个分片(ES中默认),您将获得总共5 * 200 = 1000个结果