将ElasticSearch聚合限制为前n个查询结果

Pat*_*Pan 13 search aggregation elasticsearch

我有一组280万个文档,其中包含我使用ElasticSearch查询的标记集,但其中许多文档可以通过一个ID组合在一起.我想使用标签查询我的数据,然后通过重复的ID聚合它们.我的搜索结果通常有成千上万的文档,但我只想汇总前100个搜索结果.如何将聚合仅限制为查询的前100个结果?

Rah*_*hul 8

采样器聚合

过滤聚合,用于将任何子聚合的处理限制为得分最高的文档样本。

"aggs": {
     "bestDocs": {
         "sampler": {
          //    "field": "<FIELD>", <-- optional, Controls diversity using a field
              "shard_size":100
         },
         "aggs": {
              "bestBuckets": {
                 "terms": {
                      "field": "id"
                  }
               }
         }
      }
  }
Run Code Online (Sandbox Code Playgroud)

此查询将子聚合限制为结果中的前 100 个文档,然后按 ID 对它们进行存储。

或者,您可以使用这些field or script and max_docs_per_value设置来控制在共享公共值的任何一个分片上收集的最大文档数。


Uts*_*awn 0

可以设置大小参数来定义应从整个术语列表中返回多少个术语桶

默认情况下,协调搜索过程的节点将请求每个分片提供其自己的最大大小术语存储桶,一旦所有分片响应,它会将结果减少到最终列表,然后将其返回给客户端。这意味着,如果唯一术语的数量大于大小,则返回的列表会稍微偏离并且不准确(可能是术语计数稍微偏离,甚至可能是本应位于最大大小的术语)水桶未归还)。

如果设置为 0,则大小将设置为Integer.MAX_VALUE

以下是返回前 100 名的示例代码:

{
"aggs" : {
    "products" : {
        "terms" : {
            "field" : "product",
            "size" : 100
                  }
                 }
         }
}
Run Code Online (Sandbox Code Playgroud)

您可以参考了解更多信息。

  • 这并没有回答OP的问题。要求是聚合搜索请求的前 n 个查询结果。“size”参数仅控制返回多少个聚合桶。范围仍然是所有符合查询条件的文档。 (10认同)