ElasticSearch - возвращает уникальные значения

Как получить значения всех languages из записей и сделать их уникальными.

Запись

PUT items/1
{ "language" : 10 }

PUT items/2
{ "language" : 11 }

PUT items/3
{ "language" : 10 }

Query

GET items/_search
{ ... }

# => Expected Response
[10, 11]

Любая помощь будет отличной.

Ответ 1

Вы можете использовать условия агрегации.

{
"size": 0,
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  "size" : 500 }
    }
}}

Поиск вернет что-то вроде:

{
"took" : 16,
"timed_out" : false,
"_shards" : {
  "total" : 2,
  "successful" : 2,
  "failed" : 0
},
"hits" : {
"total" : 1000000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
  "langs" : {
    "buckets" : [ {
      "key" : "10",
      "doc_count" : 244812
    }, {
      "key" : "11",
      "doc_count" : 136794

    }, {
      "key" : "12",
      "doc_count" : 32312
       } ]
    }
  }
}

Параметр size в агрегации указывает максимальное количество терминов, включаемых в результат агрегации. Если вам нужны все результаты, установите для этого значения значение, превышающее количество уникальных терминов в ваших данных.

Ответ 2

Elasticsearch 1. 1+ имеет агрегат кардинальности, который даст вам уникальный счет

Обратите внимание, что на самом деле это приближение, и точность может уменьшиться с наборами данных с большим количеством элементов, но в целом мои тесты довольно точные.

Вы также можете настроить точность с помощью параметра precision_threshold. Компромисс или курс, это использование памяти.

Этот график из документов показывает, как более высокий precision_threshold приводит к гораздо более точным результатам.


Relative error vs threshold