Reputation: 1683
I have an index and want to get a count for the entries in every type of one particular index in elasticsearch, but might not know the types ahead of time.
So, for example, the index is
/events
and the types could be
/events/type1
/events/type2
...
/events/typeN
And I'd like to query the index and say "Give me the count of each of the types under index events", so maybe a result set like
/events/type1 : 40
/events/type2: 20
/events/typeN: 10
where /events/_count would give me
/events: 70
Edit:
imotov's answer is great. I'm having trouble figuring how to get it working in JavaScript/Ajax easily though. I have something like this right now:
$.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);
}
)}'
But am only getting the total count of elements in the ES, the facets portion of the answer seems to be missing.
Upvotes: 20
Views: 30153
Reputation: 840
For Elasticsearch v5.0, search_type=count is removed. The same query from the above answers can be written as follows:
GET indexname/_search
{
"aggs": {
"count_by_type": {
"terms": {
"field": "_type"
}
}
},
"size": 0
}
Upvotes: 21
Reputation: 432
Answers by @Askshay and @Roberto highlight another important aspect. Setting size to 0 is really important, especially in low-bandwidth use-cases (say in mobile networks). It reduces the data payload size and that makes a huge difference when document size is large. Note "size": 0
GET index/_search
{
"aggs": {
"countByType": {
"terms": {
"field": "_type"
}
}
},
"size": 0
}
Upvotes: 3
Reputation: 30163
You can use terms aggregations on the _type
field to get this information:
curl "localhost:9200/test-idx/_search?search_type=count" -d '{
"aggs": {
"count_by_type": {
"terms": {
"field": "_type"
}
}
}
}'
Upvotes: 39
Reputation: 9080
The "facets" are deprecated in ES v. 1.5+ However you can use "aggregations", the use and results are quite similar:
curl "localhost:9200/events/_search?search_type=count" -d '{
"aggregations": {
"count_by_type": {
"terms": {
"field": "_type"
}
}
},
"size": 0
}'
You'll get something like:
{
"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
}
]
}
}
}
Upvotes: 8