Как получить счет для каждого типа индекса в 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"
}
}
}
}'
Ответ 2
Для Elasticsearch v5.0 удаляется search_type = count. Тот же запрос из приведенных выше ответов можно записать следующим образом:
GET indexname/_search
{
"aggs": {
"count_by_type": {
"terms": {
"field": "_type"
}
}
},
"size": 0
}
Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_search_changes.html#_literal_search_type_count_literal_removed
Ответ 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
}