2013-07-09 13 views
15

Mam indeks i chcę uzyskać liczbę wpisów we wszystkich typach jednego konkretnego indeksu w elastycznym wyszukiwaniu, ale może on nie znać typów z wyprzedzeniem.Jak uzyskać liczbę dla każdego typu indeksu w elastycznym wyszukiwaniu?

Tak więc, na przykład, indeks jest

/events 

i typy mogą być

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

I chciałbym zapytać indeks i powiedzieć: „Daj mi licznik każdego rodzaje imprez pod Index”, więc może to wynik ustawione jak

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

gdzie/wydarzenia/_count dałby mi

/events: 70 

Edit: odpowiedź

imotov jest wielki. Mam jednak problem ze zrozumieniem, jak sprawić, żeby działał w JavaScript/Ajax. Mam coś takiego właśnie teraz:

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

Ale otrzymuję tylko całkowitą liczbę elementów w ES, część aspektów odpowiedź wydaje się brakować.

Odpowiedz

34

Można używać terminów agregacje na polu _type aby uzyskać te informacje:

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

Dzięki! To z pewnością wydaje się mieć sens. Wydaje mi się, że nie mogę uzyskać tego połączenia z moim ES pracując z wywołań JavaScript/Ajax ... czy masz jakieś wskazówki, jak to zrobić? Teraz mam: $ .ajax ({ \t typ: 'GET', \t adres URL: 'http: // localhost: 9200/events/_search?search_type = count”, \t dane: '{ "aspekty": { "count_by_type": { "Terminy": { "pole": "_Typ"}}}}', \t success: function (text) { \t \t console.log (tekst); \t}, – cdietschrun

+0

Edytuj. Wydawało się, że problem wymaga POST, że wniosek, teraz rozumiem więcej. – cdietschrun

+1

Niektóre klienty HTTP nie mogą wysyłać treści żądania z żądaniami "GET". Czasami wymagane jest zastąpienie polecenia komendą 'POST'. – imotov

8

z „aspektów” są przestarzałe w ES v 1.5+ Jednak można użyć „agregacja”, wykorzystanie i wyniki są. dość podobny:

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

Dostaniesz coś takiego:

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

W przypadku Elasticsearch wersja 5.0, typ_wyszukiwania = liczba została usunięta. To samo zapytanie z powyższych odpowiedzi można zapisać następująco:

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

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

+0

Dzięki, działa, ale czy wiesz, jak odłączyć rozmiar wyniku? W moim przypadku otrzymuję count fron tylko niektóre _types – lfvv

2

odpowiedzi poprzez @Askshay i @Roberto podświetlić kolejny ważny aspekt. Ustawienie rozmiaru na 0 jest bardzo ważne, szczególnie w przypadku użycia małej przepustowości (np. W sieciach komórkowych). Zmniejsza rozmiar ładowności danych i ma duże znaczenie, gdy rozmiar dokumentu jest duży. Uwaga "rozmiar": 0

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