web-dev-qa-db-ja.com

elasticsearchでインデックスの各タイプのカウントを取得するにはどうすればよいですか?

インデックスがあり、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内の要素の総数のみを取得しているため、回答のファセット部分が欠落しているようです。

18
cdietschrun

_typeフィールドで用語集計を使用して、この情報を取得できます。

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

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

18
Akshay Bijawe

「ファセット」は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
            }
         ]
      }
   }
}
8
Roberto

@Askshayおよび@Robertoによる回答は、別の重要な側面を強調しています。サイズを0に設定することは、特に低帯域幅のユースケース(モバイルネットワークなど)では非常に重要です。データペイロードのサイズが小さくなり、ドキュメントサイズが大きい場合に大きな違いが生じます。注"サイズ":

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