Как получить счет для каждого типа индекса в elasticsearch?

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

Так, например, индекс

/events

и типы могут быть

/events/type1
/events/type2
...
/events/typeN

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

/events/type1 : 40
/events/type2: 20
/events/typeN: 10

где /events/ _count даст мне

/events: 70

Edit

Имотов ответ велик. У меня возникли проблемы с выяснением того, как легко работать в JavaScript/Ajax. У меня есть что-то вроде этого прямо сейчас:

$.ajax({
type: 'GET',
url: 'http://localhost:9200/events/_search?search_type=count',
data: '{ "facets" : { "count_by_type" : { "terms" : { "field": "_type" }}}}',
success: function(text) {
    console.log(text);
}
)}'

Но я получаю только общее количество элементов в ES, фасетная часть ответа кажется отсутствующей.

Ответы

Ответ 1

Вы можете использовать агрегирования терминов в поле _type для получения этой информации:

curl "localhost:9200/test-idx/_search?search_type=count" -d '{
    "aggs": {
        "count_by_type": {
            "terms": {
                "field": "_type"
            }
        }
    }
}'

Ответ 3

"Границы" устарели в ES v. 1.5+. Однако вы можете использовать "агрегации", использование и результаты очень схожи:

curl "localhost:9200/events/_search?search_type=count" -d '{
    "aggregations": {
        "count_by_type": {
            "terms": {
                "field": "_type"
            }
        }
    },
    "size": 0
}'

Вы получите что-то вроде:

{
   "took": 21,
   "timed_out": false,
   "_shards": {
      "total": 10,
      "successful": 10,
      "failed": 0
   },
   "hits": {
      "total": 150,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "count_by_type": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "type1",
               "doc_count": 141
            },
            {
               "key": "type2",
               "doc_count": 6
            },
            {
               "key": "other_type",
               "doc_count": 3
            }
         ]
      }
   }
}

Ответ 4

Ответы @Askshay и @Roberto выделяют еще один важный аспект. Установка размера в 0 действительно важна, особенно в случаях использования с низкой пропускной способностью (скажем, в мобильных сетях). Это уменьшает размер полезной нагрузки данных, и это имеет огромное значение при больших размерах документа. Примечание "размер": 0

GET  index/_search
{
    "aggs": {
        "countByType": {
            "terms": {
                "field": "_type"
            }
        }
    },
    "size": 0
}