ElasticSearch:如何通过键计数过滤聚合?

时间:2018-01-22 10:37:32

标签: elasticsearch aggregation

我有以下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密钥应该被加入并且根本不显示。

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

有可能吗?

2 个答案:

答案 0 :(得分:0)

泰穆拉兹,

  

但我只需要获得梅赛德斯和宝马的汇总。 SuperCar密钥应该被加入并且根本不显示。

您可以使用 must_not bool查询或必须查询,具体取决于您的观点,以获取更多信息:

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"
                 }
              }
            }
        }
      }    
}

答案 1 :(得分:0)

我在这里添加一个答案,以防有人有相同的用例。从这个问题来看,我的猜测是作者想根据关键计数过滤聚合结果,例如:搜索至少有 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"
          }
        }
      }
    }
  }    
}