Найдите различные значения, а не отдельные значения в elasticsearch

Elasticsearch документация предполагает * что их кусок кода

* документация исправлена

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "cardinality": {
        "field": "color"
      }
    }
  }
}

соответствует SQL-запросу

SELECT DISTINCT(color) FROM cars

но на самом деле это соответствует

SELECT COUNT(DISTINCT(color)) FROM cars

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

Ответ 1

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

Если вы все еще хотите токенизацию и использовать агрегацию terms, вы можете посмотреть тип индексации not_analyzed для этого поля и, возможно, использовать несколько полей.

Сводка терминов для автомобилей:

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}

Ответ 2

Чтобы обновить отличный ответ от Андрея Стефана, нам нужно сказать, что параметр запроса search_type=count больше не поддерживается в Elasticsearch 5. Новый способ сделать это - добавить "size" : 0 в тело, например:

GET /cars/transactions/_search
{
  "size": 0,
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}

Ответ 3

Лично оба ответа были для меня загадочными и безнадежно сложными, когда я хотел добавить несколько фильтров.

Для меня было разумным перейти на вкладку "Обнаружение" и применить фильтры, которые я хотел. Затем я сохранил свой поиск.

Затем я создал новую визуализацию линейчатой диаграммы, используя свой сохраненный поиск. Затем я изменил ось X, чтобы использовать агрегирование терминов на основе моей области интересов (в моем случае, имена пользователей), а затем упорядочить по количеству. Убедитесь, что размер большой, например, 500.

Вы должны быть в состоянии получить результаты в табличной форме под вашей диаграммой. Простое и не сложное программирование JSON. Просто серия кликов. Вы даже можете сохранить визуализацию на потом.

Ответ 4

Я хранил тысячи телеграмм из десятков групп. Мне нужно иметь возможность вызывать запрос с Python, чтобы вернуть уникальное значение каждой группы.

Как мне это сделать?

Мой синтаксис JSON:

    {
      "_index": "indexname",
      "_type": "items",
      "_id": "726900857_-1001397432653",
      "_version": 4,
      "_score": null,
      "_source": {
        "chat": {
          "id": -7383729824,   <=== THIS IS THE VALUE I NEED TO RETURN

Как запросить каждое уникальное значение и вернуть его?

Спасибо