Как посчитать количество всех уникальных записей в каждой группе

63 views
Skip to first unread message

Олег Ерошкин

unread,
Apr 13, 2015, 1:40:56 AM4/13/15
to elastics...@googlegroups.com

Добрый день, я новичёк в ES, подскажите, пож-ста,
Как посчитать количество всех уникальных записей в каждой группе?
Причем поле, по которому надо считать уникальность имеет формат "ff.eee"
попробовал данные запрос выполнить следующим образом:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        "range": {
                            "timestamp": {
                                "from": 1420078430577,
                                "to": 1422730799000
                            }
                        },
                        {
                            "terms": {
                                "name": [
                                    "filter_value1"
                                ]
                            }
                        }
                    ]
                }
            }
        }
    },
    "aggs": {
        "group_distinct": {
            "cardinality": {
                "field": "device.id"
            }
        },
        "aggs": {
            "terms": {
                "field": "device.id"
            }
        }
    }
}

но 
1. массив значений не отфильтровался 
2. не вывело группировки

Igor Motov

unread,
Apr 13, 2015, 2:32:35 AM4/13/15
to elastics...@googlegroups.com
А как поле device.id индексировано? Если оно не "not_analyzed" в этом скорее всего проблема. Если не угадал, приведите пожалуйста пример данных и маппинг. 

Олег Ерошкин

unread,
Apr 13, 2015, 2:59:09 AM4/13/15
to elastics...@googlegroups.com
Спасибо большое за столь оперативную реакцию...

чуток изменил запрос, группировка стала работать, но данные не понятные и без количества уникальных данных по каждой группе...

измененный запрос:
{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "name": "filter.value.1"
                }
            }
        }
    },
    "aggs": {
        "most_popular": {
            "terms": {
                "field": "device.id"
            }
        },
        "unique_group": {
            "cardinality": {
                "field": "device.id"
            }
        }
    }
}

полученные данные:
{
  "took" : 82,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 496940,
    "max_score" : 1.0,
    "hits" : [ {
....10 элементов
    } ]
  },
  "aggregations" : {
    "most_popular" : {
      "buckets" : [ {
        "key" : "nuid",
        "doc_count" : 496940
      }, {
        "key" : "3003733188",
        "doc_count" : 994
      }, {
        "key" : "3002756006",
        "doc_count" : 586
      }, {
        "key" : "3003633802",
        "doc_count" : 500
      }, {
        "key" : "3003208883",
        "doc_count" : 451
      }, {
        "key" : "3003203923",
        "doc_count" : 414
      }, {
        "key" : "3003675635",
        "doc_count" : 392
      }, {
        "key" : "3003208863",
        "doc_count" : 256
      }, {
        "key" : "3003223005",
        "doc_count" : 252
      }, {
        "key" : "3003710216",
        "doc_count" : 155
      } ]
    },
    "unique_group" : {
      "value" : 25199
    }
  }

я не совсем понял результаты...
Правильно ли я понял, что всего уникальных device.id =  25199? 
а в разрезе по каждому Device.id 
3003710216 - 155
3003223005 - 252 и т.д.

но тогда не понятно, почему buckets выведено не 25199 элементов? Как вывести все группы?
res.txt

Igor Motov

unread,
Apr 13, 2015, 3:08:53 AM4/13/15
to elastics...@googlegroups.com
Прежде всего надо сделать device.id not_analyzed - http://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html#_index_2

В группировку "terms" надо добавить параметр "size": 100000
Reply all
Reply to author
Forward
0 new messages