查找每个唯一存储桶中的前5个文档

时间:2018-04-30 07:31:20

标签: elasticsearch

让我们说我有很多ElasticSearch文档,如下面给出的示例:

 {
    "Tagname": [
        "Veniam"
    ],
    "Title": [
        "Occaecat do. Eu ut."
    ]
  },
  ...
  ...
  ...
  {
    "Tagname": [
        "Anim"
    ],
    "Title": [
        "Consectetur dolor consectetur eu."
    ]
  },
  ...
  ...
  ...
  {
    "Tagname": [
        "Aliqua"
    ],
    "Title": [
        "Culpa in ut ut. Enim in excepteur eiusmod."
    ]
  }
  ...
  ...
  ...   

在这里,我们假设Tagname是每个Title落下的标记的名称。并且Tagname被映射为keyword,这样当我在Tagname.keyword上聚合时,我会得到3个独特的TagName桶(Veniam,Anim,Aliqua等)。 ..)。在我的情况下,假设我们没有固定数量的唯一TagName,它可能会动态更改。因此,我们无法在搜索查询中假设一个唯一TagName的静态列表。

我现在想要实现的是在每个存储桶下获得前5个Title值。 (到目前为止,排序或排序任何排序都不是必需的,随机5也可以。但是对排序的解释会很有启发。)

1 个答案:

答案 0 :(得分:0)

我建议使用以下聚合。我使用了100的任意大小,但您可以使用Tagname字段的基数替换它,以确保每个值Tagname获得一个存储桶。然后,您有一个嵌套的top_hits聚合,它将为每个存储桶返回5个文档。

{
  "size": 0,
  "aggs": {
    "tags": {
      "terms": {
        "field": "Tagname.keyword",
        "size": 100
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 5
          }
        }
      }
    }
  }
}