Агрегация Elasticsearch по значениям во вложенном списке (массиве) - PullRequest
0 голосов
/ 16 ноября 2018

Я сохранил некоторые значения во вложенном типе данных Elasticsearch (массив), но без использования пары ключ / значение. Пример записи будет:

{
  "categories": [
  "Category1",
  "Category2"
  ],
  "product_name": "productx"
}

Теперь я хочу запустить агрегирующий запрос, чтобы узнать уникальный список доступных категорий. Но все примеры, которые я видел, указывали на отображение, которое имеет ключ / значение. Есть ли способ использовать вышеуказанную схему как есть или мне нужно изменить схему на что-то подобное, чтобы выполнить агрегационный запрос

{
  "categories": [
     {"name": "Category1"},
     {"name": "Category2"}
  ],
  "product_name": "productx"
}

1 Ответ

0 голосов
/ 16 ноября 2018

Что касается структуры JSON, вам нужно сделать шаг назад и выяснить, хотите ли вы иметь пары list или key-value.

Глядя на ваш пример, я не думаю, что вам нужны пары key-value, но опять же это то, что вы, возможно, захотите уточнить, разбираясь в своем домене, если будет еще несколько свойств для categories.

Что касается агрегации, насколько я знаю, aggregations будет работать с любой допустимой структурой JSON.

Для упомянутых вами данных вы можете воспользоваться приведенным ниже запросом aggregation.Также я предполагаю, что поля имеют тип keyword.

Запрос агрегации

POST <your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "myaggs": {
      "terms": {
        "size": 100,
        "script": {
          "inline": """
            def myString = "";
            def list = new ArrayList();
            for(int i=0; i<doc['categories'].length; i++){
              myString = doc['categories'][i] + ", " + doc['product'].value;
              list.add(myString);
            }
            return list;
            """
        }
      }
    }
  } 
}

Ответ агрегации

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "myaggs": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "category1, productx",
          "doc_count": 1
        },
        {
          "key": "category2, productx",
          "doc_count": 1
        }
      ]
    }
  }
}

Надеюсь, это поможет!

...