Комплексная агрегация Elasticsearch Одно вложенное значение минус второе вложенное значение и группа по третьему вложенному значению - PullRequest
0 голосов
/ 24 сентября 2019

Я действительно запутался.

Я создал вложенную структуру с тремя типами данных внутри, addfields - это вложенный тип данных со свойствами:

  • id тип целое число

  • значение тип текст данные поля true

  • value_numeric type double

Данные внутри упругой выглядят так:

{
  "_index": "item",
  "_type": "_doc",
  "_source": {
    "id": 1,
    "addfields": [
      {
        "id": 1,
        "value_numeric": 10
      },
      {
        "id": 2,
        "value_numeric": 10
      },
      {
        "id": 3,
        "value": "Daniel"
      },
    ]
  },
}
------------------------------------------------------------------------------------
{
  "_index": "item",
  "_type": "_doc",
  "_source": {
    "id": 2,
    "addfields": [
      {
        "id": 1,
        "value_numeric": 150
      },
      {
        "id": 2,
        "value_numeric": 100
      },
      {
        "id": 3,
        "value": "Daniel"
      },
    ]
  },
}
------------------------------------------------------------------------------------
{
  "_index": "item",
  "_type": "_doc",
  "_source": {
    "id": 2,
    "addfields": [
      {
        "id": 1,
        "value_numeric": 250
      },
      {
        "id": 2,
        "value_numeric": 200
      },
      {
        "id": 3,
        "value": "Richard"
      },
    ]
  },
}

Я хочуагрегировать эти данные, например:

addfields [1] - addfields [2] и группировать их по addfields [3]

Я пытался использовать bucket_script следующим образом, но дела шли не очень хорошо.

{
  "size": 0,
  "aggs": {
    'nested' => [
        'path' => 'addfields',
    ],
    "addfields": {
      "aggs": {
        "leftfield": {
          "filter": {
            "bool": {
                "must": {
                    {
                        "match": {"addfields.id": 1}
                    }
                }
            }
          },
          "aggs": {
            "values": {
                "terms": {
                    "field": "value_numeric",
                    "size": 9999
                }
            }
          }
        },
        "rightfield": {
            "filter": {
            "bool": {
                "must": {
                    {
                        "match": {"addfields.id": 2}
                    }
                }
            }
          },
          "aggs": {
            "values": {
                "terms": {
                    "field": "value_numeric",
                    "size": 9999
                }

        },
        "calculate": {
          "bucket_script": {
            "buckets_path": { 
              "left": "leftfield",
              "right": "rightfield"
            },
            "script": {
              "source": "params.leftfield - params.rightfield"
            }
          }
        }
      }
    }
  }
}
...