如何获取一对字段值的计数?

时间:2017-09-14 13:18:36

标签: elasticsearch aggregation

我需要根据elasticsearch中的数据构建热图。热图是两个特定字段具有相同值的情况的计数。对于数据

{'name': 'john', 'age': '10', 'car': 'peugeot'}
{'name': 'john', 'age': '10', 'car': 'audi'}
{'name': 'john', 'age': '12', 'car': 'fiat'}
{'name': 'mary', 'age': '3', 'car': 'mercedes'}

我想获得nameage值的唯一对数。那将是

john, 10, 2
john, 12, 1
mary, 3, 1

我可以获得所有事件并自己计算,但我希望会有一些神奇的聚合可以提供这个。

以嵌套形式(例如

)使用它不会有问题
{
  'john':
    {
      '10': 2,
      '12': 1
    },
  'mary':
    {
      '3': 1
    },
}

或其他任何实用的东西。

2 个答案:

答案 0 :(得分:1)

您可以使用Inner aggregation。使用像

这样的查询
POST count-test/_search
{
"size": 0,
"aggs": {
  "group By Name": {
     "terms": {
        "field": "name"
     },
     "aggs": {
        "group By age": {
           "terms": {
              "field": "age"
             }
           }
         }
       }
     }
   }

输出不会像你提到的那样,但是喜欢。

"aggregations": {
  "group By Name": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
        {
           "key": "john",
           "doc_count": 3,
           "group By age": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                 {
                    "key": "10",
                    "doc_count": 2
                 },
                 {
                    "key": "12",
                    "doc_count": 1
                 }
              ]
           }
        },
        {
           "key": "mary",
           "doc_count": 1,
           "group By age": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                 {
                    "key": "3",
                    "doc_count": 1
                 }
              ]
           }
        }
      ]
    }
 }

希望这会有所帮助!!

答案 1 :(得分:0)

您可以将术语聚合与脚本一起使用:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_multi_field_terms_aggregation

像这样你可以“连接”你想要的东西,如:

{
    "aggs" : {
        "data" : {
            "terms" : {
                "script" : {
                    "source": "doc['name'].value + doc['name'].age",
                    "lang": "painless"
                }
            }
        }
    }
}

(不确定字符串concat语法)。