在弹性搜索中按几个术语分组并限制

时间:2019-04-05 15:52:50

标签: elasticsearch grouping elasticsearch-aggregation

我有一个像这样的索引(举一个抽象的例子)

{"name": "John", "district": 1, "lastName": "Smith"},
{"name": "Anne", "district": 1, "lastName": "Smith"},
{"name": "Mary", "district": 2, "lastName": "Smith"},
{"name": "Bobby", "district": 2, "lastName": "Smith"},
{"name": "Nick", "district": 1, "lastName": "Smith"},
{"name": "Bob", "district": 3, "lastName": "Smith"},
{"name": "Kenny", "district": 1, "lastName": "Smith"}

我想做一些类似于SQL的GROUP BY name, district, lastName LIMIT 100,但要进行弹性搜索。

我认为我需要使用嵌套的terms聚合(术语aggs内的术语aggs内术语aggs内)。

但是我想将所有分组结果限制为100个(而不是每个区100个)

如何实现?有没有一种方法可以执行此操作而无需查询比我们需要更多的内容?

2 个答案:

答案 0 :(得分:0)

您可以使用过滤器或在

之类的聚合中定义大小
"aggs": {
        "NAME": {
          "filter": {
            "term": {
              "ATTRIBUTES.ATTR_TYPE": "EDUCATION_DEGREE"
            }
          },
          "aggs": {
            "NAME": {
              "terms": {
                "field": "ATTRIBUTES.DESCRIPTION",
                "size": 100
              }
            }
          }
        }
      }
    }
  }

答案 1 :(得分:0)

您可以从Elasticsearch 6.1开始使用composite aggregation。您可以定义size参数以将存储桶限制为100个。

希望有帮助!