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

时间:2015-03-06 09:42:38

标签: search elasticsearch aggregation

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

3 个答案:

答案 0 :(得分:4)

Sampler Aggregation

  

用于限制任何子聚合的过滤聚合'处理   获得最高分的文件样本。

"aggs": {
     "bestDocs": {
         "sampler": {
          //    "field": "<FIELD>", <-- optional, Controls diversity using a field
              "shard_size":100
         },
         "aggs": {
              "bestBuckets": {
                 "terms": {
                      "field": "id"
                  }
               }
         }
      }
  }

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

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

答案 1 :(得分:1)

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

默认情况下,协调搜索过程的节点将请求每个分片提供自己的最大大小的术语桶,一旦所有分片响应,它将把结果减少到最终列表,然后返回给客户端。这意味着如果唯一术语的数量大于大小,则返回的列表略有偏差且不准确(可能是术语计数略有偏差,甚至可能是应该在顶部大小的术语水桶没有退回)。

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

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

{
"aggs" : {
    "products" : {
        "terms" : {
            "field" : "product",
            "size" : 100
                  }
                 }
         }
}

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

答案 2 :(得分:-3)

您可以使用min_doc_count参数

{
"aggs" : {
    "products" : {
        "terms" : {
            "field" : "product",
            "min_doc_count" : 100
                  }
                 }
         }
}