Elasticsearch-如何执行max_documents_per_field查询

时间:2018-11-09 00:47:14

标签: elasticsearch

我与人有指数。我想检索总共100个人(根据多个过滤器),但最终每个位置最多要强加3个人。

例如

索引:

| name    | location |
|---------|----------|
| Frodo   | Shire    |
| Sam     | Shire    |
| Merry   | Shire    |
| Pippin  | Shire    |
| Boromir | Gondor   |
| Faramir | Gondor   |

查询的结果应类似于: Frodo,Sam,Merry,Boromir,Faramir

1 个答案:

答案 0 :(得分:2)

我认为不可能完全得到想要的东西。实质上,您是在location字段上进行分组依据(术语汇总)。由于无法确切知道您有多少个位置,因此组的数量是无限的。因此,如果有101个组,并且每个组返回一个名称,那么您将获得101个结果。而且,如果我们要筛选出100个最大结果,我们应该丢弃哪个组?随机吗?

也就是说,您可以获得{em> x 位置最高的位置,但位置可以按降序排列,尽管您可以change the sorting order。 33个位置存储桶,每个存储桶3个结果是99 ...足够接近吗?

因此,使用terms aggregation和嵌套的top hits aggregation

,对于33个位置,每个位置最多可获得3个结果

GET lotr/_search?size=0
{
  "aggs": {
    "location": {
      "terms": {
        "field": "location",
        "size": 33
      },
      "aggs": {
        "name": {
          "top_hits": {
            "size": 3,
            "_source": {
              "includes": ["name"]
            }
          }
        }
      }
    }
  }
}