2015-09-15 4 views
0

Я хочу получить уникальные значения из elasticsearch в поле с именем «name», Я не знаю, как я могу поставить условие, когда значения должны быть уникальными.elasticsearch уникальные значения агрегирование

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

So basically what i need is a aggregation query that fetch the unique values 

Может кто-нибудь помочь мне исправить эту проблему, спасибо много в продвинутом виде.

ответ

1

Вы можете использовать агрегирование terms на поле not_analyzed.

Однако, по умолчанию это ограничение относится к числу 10 самых популярных терминов. Вы можете изменить это, обновив параметр size агрегации terms. Установка его на 0 позволит вам получить до Integer.MAX_VALUE различные условия (см. Документацию here).

Ниже приведен пример отображения:

POST terms 
{ 
    "mappings":{ 
    "test":{ 
     "properties":{ 
     "title":{ 
      "type":"string", 
      "index":"not_analyzed" 
     } 
     } 
    } 
    } 
} 

Добавление некоторых документов:

POST terms/test 
{ 
    "title":"Foundation" 
} 


POST terms/test 
{ 
    "title":"Foundation & Empire" 
} 

Наконец, запрос:

POST terms/_search?search_type=count 
{ 
    "aggs": { 
    "By Title": { 
     "terms": { 
     "field": "title", 
     "size": 0 
     } 
    } 
    } 
} 

даст вам то, что вам нужно:

"aggregations": { 
     "By Title": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "Foundation", 
       "doc_count": 1 
      }, 
      { 
       "key": "Foundation & Empire", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 

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