Запрос агрегации ElasticSearch со списком в документах - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть следующие записи о продажах автомобилей разных марок в разных городах.

Документ -1

{
"city": "Delhi",
"cars":[{
  "name":"Toyota",
  "purchase":100,
  "sold":80
},{
  "name":"Honda",
  "purchase":200,
  "sold":150
}]
}

Документ -2

{
"city": "Delhi",
"cars":[{
  "name":"Toyota",
  "purchase":50,
  "sold":40
},{
  "name":"Honda",
  "purchase":150,
  "sold":120
}]
}

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

Требуемый результат:

{
"city": "Delhi",
"cars":[{
  "name":"Toyota",
  "purchase":150,
  "sold":120
},{
  "name":"Honda",
  "purchase":350,
  "sold":270
}]
}

1 Ответ

0 голосов
/ 25 февраля 2020

Сначала вам нужно отобразить ваш массив как вложенное поле (скрипт будет сложным и бесполезным). Вложенные поля проиндексированы, агрегация будет довольно быстрой.

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

{
  "mappings": {
    "test": {
      "properties": {
        "city": {
          "type": "keyword"
        },
        "cars": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "keyword"
            },
            "purchase": {
              "type": "integer"
            },
            "sold": {
              "type": "integer"
            }
          }
        }
      }
    }
  }
}

Индексируйте ваш документ (так же, как вы сделали)

Для агрегации:

{
  "size": 0,
  "aggs": {
    "avg_grade": {
      "terms": {
        "field": "city"
      },
      "aggs": {
        "resellers": {
          "nested": {
            "path": "cars"
          },
          "aggs": {
            "agg_name": {
              "terms": {
                "field": "cars.name"
              },
              "aggs": {
                "avg_pur": {
                  "sum": {
                    "field": "cars.purchase"
                  }
                },
                "avg_sold": {
                  "sum": {
                    "field": "cars.sold"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

результат:

buckets": [
{
"key": "Honda",
"doc_count": 2,
"avg_pur": {
"value": 350
},
"avg_sold": {
"value": 270
}
}
,
{
"key": "Toyota",
"doc_count": 2,
"avg_pur": {
"value": 150
},
"avg_sold": {
"value": 120
}
}
]

если у вас есть индекс поля имени / города в виде текста (сначала нужно спросить, если это необходимо), используйте .keyword в термине агрегации ("cars.name.keyword").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...