【问题标题】:ElasticSearch: How to filter aggregation by keys count?ElasticSearch:如何按键数过滤聚合?
【发布时间】:2021-01-06 12:05:18
【问题描述】:

我有以下 es 查询:

{
  "size": 0,
   "aggs" : {
        "make": {
            "terms" : { "field" : "make", size: 0 },           
            "aggs": {
              "model": {
                "terms": {
                  "field": "model"
                }
              }
            }
        }
      }    
}

这给了我以下(示意图)结果。

---------------------
key: Mercedes

doc_count:201

    key: S350
    doc_count: 100

    key: E200
    doc_count: 101

---------------------
key: Bmw    

doc_count: 500
    key: 750
    doc_count: 300

    key: 530
    doc_count: 200

---------------------
key: SuperCar

doc_count: 300

    key: T123
    doc_count: 300

但我只需要获得梅赛德斯和宝马的聚合。 SuperCar 钥匙应该是 ingored 并且根本不显示。

例如,我需要按子聚合唯一键计数过滤聚合。

有可能吗?

【问题讨论】:

  • SuperCar 应该被忽略为过滤器(或)聚合中的最后一个结果,你能解释一下I need to filter aggregations by sub aggregations unique keys count.吗?

标签: elasticsearch aggregation


【解决方案1】:

提穆拉兹,

但我只需要获得梅赛德斯和宝马的聚合。 SuperCar 钥匙应该是 ingored 并且根本不显示。

您可以根据自己的观点使用 must_not bool 查询或 must 查询,以获取更多信息:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

例如,我需要按子聚合唯一键计数过滤聚合。

有可能吗?

如果我猜对了,你想知道每个品牌有多少个型号,对吧?为此,您可以使用基数聚合:

{
  "size": 0,
   "aggs" : {
        "make": {
            "terms" : { "field" : "make", size: 0 },           
            "aggs": {
              "model": {
                "terms": {
                  "field": "model"
                }
              },
              "model_count":{
                 "cardinality":{
                    "field":"model"
                 }
              }
            }
        }
      }    
}

【讨论】:

    【解决方案2】:

    我在这里添加一个答案,以防有人有相同的用例。从这个问题来看,我的猜测是作者希望根据他们的关键计数过滤聚合结果,例如:搜索所有至少有 2 个型号的汽车品牌。

    感谢@lpeixotoo 指出基数聚合,下一步是使用桶选择器聚合,我将查询更新如下:

    {
      "size": 0,
      "aggs" : {
        "make": {
          "terms" : { "field" : "make", size: 0 },           
          "aggs": {
            "model": {
              "terms": {
                "field": "model"
              }
            },
            "model_count": {
               "cardinality": {
                  "field":"model"
              }
            },
            "model_count_filter": {
              "bucket_selector": {
                "buckets_path": {
                  "modelCount": "model_count"
                },
                "script": "params.modelCount >= 2"
              }
            }
          }
        }
      }    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2021-02-05
      • 2021-04-22
      • 2015-09-17
      • 2014-02-02
      相关资源
      最近更新 更多