web-dev-qa-db-fra.com

Comment obtenir un compte pour chaque type d'index en Elasticsearch?

J'ai un index et je veux obtenir un compte pour les entrées de chaque type d'index particulier à Elasticssearch, mais peut ne pas connaître les types à l'avance.

Donc, par exemple, l'index est

/events

et les types pourraient être

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

Et j'aimerais interroger l'index et dire "Donnez-moi le nombre de types de types sous les événements d'index", alors peut-être un résultat comme

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

où/événements/_Count me donnerait

/events: 70

éditer:

la réponse d'Imotov est géniale. Je rencontre des difficultés à comprendre comment travailler avec JavaScript/Ajax facilement. J'ai quelque chose comme ça en ce moment:

$.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);
}
)}'

Mais je ne reçois que le nombre total d'éléments dans l'ES, la partie des facettes de la réponse semble manquante.

18
cdietschrun

Vous pouvez utiliser des agrégations de termes sur le _type Champ pour obtenir cette information:

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

Pour Elasticsearch V5.0, Search_Type = Nombre est supprimé. La même requête des réponses ci-dessus peut être écrite comme suit:

GET  indexname/_search
{
    "aggs": {
        "count_by_type": {
            "terms": {
                "field": "_type"
            }
        }
    },
    "size": 0
}

Ref: https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breal_50_search_changes.html#_literal_search_type_count_literal_removed

18
Akshay Bijawe

Les "facettes" sont obsolètes en ES v. 1.5+ Cependant, vous pouvez utiliser des "agrégations", l'utilisation et les résultats sont assez similaires:

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

Vous obtiendrez quelque chose comme:

{
   "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

Les réponses de @askshay et @roberto mettent en évidence un autre aspect important. La taille de la taille de 0 est vraiment importante, en particulier dans les cas d'utilisation de la bande passante (par exemple dans les réseaux mobiles). Il réduit la taille de la charge utile de données et qui fait une énorme différence lorsque la taille du document est grande. NOTE "Taille":

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