2016-07-15 5 views
0

Я пытаюсь сделать запрос условия фильтра, чтобы получить количество документов, у меня есть для каждого домена в списке доменов:Могу ли я получить счет для каждого из списка доменов?

GET /myindex/_count 
{ 
    "query": { 
     "filtered": { 
     "filter": { 
      "terms": { 
       "domain": ["w3.org"] 
      } 
     } 
     } 
    } 
} 

Возвращает 25. У меня есть список из пары тысяч доменов и хотел бы сделать это все в 1 запросе. Это возможно? Я пробовал:

GET /myindex/_count 
{ 
    "query": { 
    "bool": { 
     "must": { 
     "terms": { 
      "domain": [ 
      "w3.org", 
      "google.com", 
      ..., 
      ] 
     } 
     } 
    } 
    } 
} 

, но это дает мне 1 номер (в то время как мне нужно их с разбивкой по каждой области), например:

w3.org: 25, 
google.com: 143, 
... 
+0

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html –

ответ

1

query не возвращает счетчик для каждого члена сопоставления найденного, он покажет вам, сколько совпадающих документов найдено, в основном попадает в терминологию elasticsearch. Чтобы получить номера с каждым термином, который вы нашли, вы должны использовать aggregations, больше доступных данных here.

Для вашего конкретного случая вы должны использовать Terms Aggregation, больше доступных данных here.

Ваш запрос будет выглядеть следующим образом

GET /myindex/_search 
{ 
    "query": { 
    "bool": { 
     "must": { 
     "terms": { 
      "domain": [ 
      "w3.org", 
      "google.com" 
      ] 
     } 
     } 
    } 
    }, 
    "aggregations":{ 
    "domain_count":{ 
     "terms":{ 
     "field": "domain" 
     } 
    } 
    } 
} 

Отклик будет выглядеть примерно так, где doc_count и key внутри buckets это ваш искомый результат.

{ 
    ... 

    "aggregations" : { 
     "domain_count" : { 
      "doc_count_error_upper_bound" : 46, 
      "buckets" : [ 
       { 
        "key" : "w3.org", 
        "doc_count" : 100 
       }, 
       { 
        "key" : "google.com", 
        "doc_count" : 52 
       }, 
       ... 
      ] 
     } 
    } 
} 

Убедитесь, что вы используете _search конечную точку вместо _count.

Если вы не хотите ограничивать свой запрос для конкретных доменов, таких как w3.org или google.com, вы можете отправить запрос match_all. Он даст вам все возможные значения domain с их doc_count.

GET /myindex/_search 
{ 
    "query": { 
    "bool": { 
     "must": { 
     "match_all": { 
     } 
     } 
    } 
    }, 
    "aggregations":{ 
    "domain_count":{ 
     "terms":{ 
     "field": "domain" 
     } 
    } 
    } 
} 
+0

Можно ли сделать Multisearch но ж/кол? –

+0

@kristen by 'multisearch', если вы имели в виду [это] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html), то да, вы можете это сделать. –

+0

Да, но есть ли тот, который использует _count, а не _search? –

Смежные вопросы