2013-07-09 11 views
15

Ho un indice e voglio ottenere un conteggio per le voci in ogni tipo di un particolare indice in elasticsearch, ma potrebbe non conoscere i tipi in anticipo.Come ottenere un conteggio per ogni tipo di indice in elasticsearch?

Così, per esempio, l'indice è

/events 

e le tipologie potrebbero essere

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

e mi piacerebbe per interrogare l'indice e dire "Dammi il conteggio di ciascuno di i tipi di eventi sotto indice", quindi forse un set di risultati come

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

dove/eventi/_count avrebbero darmi

/events: 70 

Edit: risposta

di imotov è grande. Sto avendo problemi a capire come farlo funzionare in JavaScript/Ajax facilmente però. Ho qualcosa di simile in questo momento:

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

Ma sto ottenendo soltanto il numero totale di elementi in ES, la porzione sfaccettature della risposta sembra mancare.

risposta

34

È possibile utilizzare termini aggregazioni sul campo _type per ottenere queste informazioni:

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

Grazie! Questo sembra sicuro. Non riesco a ottenere questa chiamata al mio ES lavorando da JavaScript/chiamate Ajax però ... hai qualche consiglio su come farlo? Ora ho: $ .ajax ({ \t tipo: 'GET', \t url: 'http: // localhost: 9200/events/_search?SEARCH_TYPE = count', \t dati: '{ "faccette": { "count_by_type": { "termini": { "campo": "_type"}}}}', \t successo: la funzione (testo) { \t \t console.log (testo); \t}, – cdietschrun

+0

Modifica. Sembrava che il problema avesse bisogno di POST quella richiesta, ora capisco di più. – cdietschrun

+1

Alcuni client HTTP non possono inviare il corpo della richiesta con richieste 'GET'. Quindi, a volte è necessario sostituire il comando con 'POST'. – imotov

8

I "faccette" sono obsoleti in ES v 1.5 + Tuttavia è possibile utilizzare "aggregazioni", l'uso ei risultati sono. abbastanza simile:

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

Si otterrà qualcosa del tipo:

{ 
    "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 
      } 
     ] 
     } 
    } 
} 
13

Per Elasticsearch v5.0, search_type = conteggio rimosso. La stessa query dalle risposte di cui sopra può essere scritta come segue:

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

Rif: https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_search_changes.html#_literal_search_type_count_literal_removed

+0

Grazie, funziona, ma sai come limitare la dimensione del risultato? Nel mio caso sto ottenendo il conteggio solo di alcuni tipi – lfvv

2

Risposte di @Askshay e @Roberto evidenziare un altro aspetto importante. L'impostazione della dimensione su 0 è molto importante, specialmente nei casi di utilizzo con larghezza di banda ridotta (ad esempio nelle reti mobili). Riduce le dimensioni del payload dei dati e questo fa una grande differenza quando la dimensione del documento è grande. Nota "size": 0

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