インデックスがあり、elasticsearchの特定のインデックスのすべてのタイプのエントリの数を取得したいのですが、事前にタイプがわからない場合があります。
したがって、たとえば、インデックスは
/events
そしてタイプは
/events/type1
/events/type2
...
/events/typeN
そして、インデックスをクエリして「インデックスイベントでの各タイプの数を教えてください」と言いたいので、結果セットは
/events/type1 : 40
/events/type2: 20
/events/typeN: 10
/ events/_countが私に与える場所
/events: 70
編集:
imotovの答えは素晴らしいです。 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内の要素の総数のみを取得しているため、回答のファセット部分が欠落しているようです。
_type
フィールドで用語集計を使用して、この情報を取得できます。
curl "localhost:9200/test-idx/_search?search_type=count" -d '{
"aggs": {
"count_by_type": {
"terms": {
"field": "_type"
}
}
}
}'
Elasticsearch v5.0では、search_type = countが削除されました。上記の回答からの同じクエリは、次のように書くことができます。
GET indexname/_search
{
"aggs": {
"count_by_type": {
"terms": {
"field": "_type"
}
}
},
"size": 0
}
「ファセット」は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
}
]
}
}
}
@Askshayおよび@Robertoによる回答は、別の重要な側面を強調しています。サイズを0に設定することは、特に低帯域幅のユースケース(モバイルネットワークなど)では非常に重要です。データペイロードのサイズが小さくなり、ドキュメントサイズが大きい場合に大きな違いが生じます。注"サイズ":
GET index/_search
{
"aggs": {
"countByType": {
"terms": {
"field": "_type"
}
}
},
"size": 0
}