【问题标题】:Is there any 'Post-Aggregation' method in ElasticSearchElasticSearch 中是否有任何“后聚合”方法
【发布时间】:2017-09-28 02:52:15
【问题描述】:

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

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

结合聚合范围,我得到了命中范围内的 1000 个文档,以及索引中所有匹配文档的聚合结果。

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

我知道在查询范围内有一种称为“后过滤”的方法,它发生在聚合计算之后。

所以,我正在搜索的是一些“后聚合”,它发生在文档被检索到之后,因此聚合只会在那些被检索到的文档上为真。

这是一些查询示例:

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

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

有什么建议吗?

【问题讨论】:

    标签: elasticsearch aggregation


    【解决方案1】:

    我想只获得这 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 个结果

    【讨论】:

    • 谢谢弗拉德。它与返回的点击有任何关联吗?
    • 不,您在聚合中设置的任何内容都与搜索命中分开。
    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2022-01-26
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多