2015-09-15 4 views
3

Я пытаюсь получить уникальные значения из моей базы данных elasticsearch.elasticsearch aggregation PHP

Так что я хочу уникальные имена из моей базы данных elasticsearch.

Так я агрегирование как так ---

$paramss = [ 
      'index' => 'myIndex', 
      'type' => 'myType', 
      'ignore_unavailable' => true, 
      'ignore' => [404, 500] 
     ]; 


    $paramss['body'] = <<<JSON 
{ 
"size": 0, 
"aggs" : { 
    "langs" : { 
     "terms" : { "field" : "name" } 
    } 
}} 
JSON; 

     $results = $client->search($paramss); 
     print_r(json_encode($results)); 

я получить результат, как так ---

{ 
took: 3, 
timed_out: false, 
_shards: { 
    total: 5, 
    successful: 5, 
    failed: 0 
}, 
hits: { 
    total: 1852, 
    max_score: 0, 
    hits: [ 

    ] 
}, 
aggregations: { 
    langs: { 
     buckets: [ 
      { 
       key: "aaaa.se", 
       doc_count: 430 
      }, 
      { 
       key: "bbbb.se", 
       doc_count: 358 
      }, 
      { 
       key: "cccc.se", 
       doc_count: 49 
      }, 
      { 
       key: "eeee.com", 
       doc_count: 46 
      } 
     ] 
    } 
} 
} 

Но проблема в том, я не получаю все уникальные значения, я я получаю только 10 значений, значение по умолчанию для запроса elasticsearch.

Так как я могу изменить размер запроса !!!

я попытался как так ---

$paramss = [ 
      'index' => 'myIndex', 
      'type' => 'myType', 
      'size' => 1000, 
      'ignore_unavailable' => true, 
      'ignore' => [404, 500] 
     ]; 

который возвращает мне некоторые странные документы.

Так кто-нибудь знает решение этой проблемы.

Как я могу получить все уникальные имена из моей базы данных elasticsearch, может кто-то поможет мне исправить эту проблему.

ответ

2

Вы также делаете everuthing право, кроме вас size.

"size": 0 должен прибыть после названия целевого поля.

$client = new Elasticsearch\Client($params); 
    $query['body'] = '{ 
     "aggs" : { 
      "all_sources" : { 
       "terms" : { 
        "field" : "source", 
        "order" : { "_term" : "asc" }, 
        "size": 0 
       } 
      } 
     } 
    }'; 
1

Вам нужно поставить параметр размера в терминах:

{ 
"aggs" : { 
    "langs" : { 
     "terms" : { 
      "field" : "name", 
      "size": 0 
     } 
    } 
}} 

Ссылка на документацию, где вы можете найти более подробную информацию: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

+0

Нет, вы этого не сделали. У вас есть параметр размера на том же уровне, что и aggs. – Piotr

+0

почему этот ответ проголосовали. Это точно правильный ответ. Вы должны определить размер = 0 внутри своих агрегатов, иначе ES будет агрегировать только 20 лучших результатов. –

+0

@thanks для вашего ответа :) –

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