Сортировка результатов агрегации по субагрегации в порядке возрастания - PullRequest
2 голосов
/ 06 июня 2019

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

Код:

"aggregation":[
"agg_max_saving_percent"=> [
                    "terms"=> [
                        "field"=> 'key',
                        'size' => 60,
                        'order' => [ 'maximma' => 'desc' ]
                    ],

                    "aggs"=> [
                        "offers"=> [
                            "nested"=> [
                                "path"=> "offers"
                            ],
                            "aggs"=> [
                                "found_savper"=> [
                                    "max"=> [
                                        "field"=> "offers.savper"
                                    ]
                                ]
                            ],

                        ]
                    ],
                    "aggs"=> [  "maximma" => ["max" => ['field' => "sum_score"]]],

                ]
]

Отображение:

"offers": {
 "type": "nested",
            "properties": {
             "savper": {"type": "long"}
}
}

"sum_score": {"type": "long"},

В данный момент я получаю только результаты «MAXIMA», с которыми я сортирую, а нерезультаты 'found_savper'

Хотя мне нужны результаты found_savper и я хочу, чтобы корзина сортировалась по maxima desc.Есть предложения?

1 Ответ

1 голос
/ 07 июня 2019

Вам нужно будет использовать Bucket Sort Aggregation для варианта использования, который вы ищете.

Ниже приведены примеры документов, реализованный мной запрос агрегации и ответ:

Документы:

POST myaggregation/_doc/1
{
  "key": "1001",
  "offers":[
    {
      "savper": 1000
    },
    {
      "savper": 2000
    }
  ],
  "sum_score": 1
}

POST myaggregation/_doc/2
{
  "key": "1001",
  "offers":[
    {
      "savper": 3000
    },
    {
      "savper": 4000
    }
  ],
  "sum_score": 2
}

POST myaggregation/_doc/3
{
  "key": "1002",
  "offers":[
    {
      "savper": 1000
    },
    {
      "savper": 2000
    }
  ],
  "sum_score": 2
}

POST myaggregation/_doc/4
{
  "key": "1002",
  "offers":[
    {
      "savper": 3000
    },
    {
      "savper": 4000
    }
  ],
  "sum_score": 4
}

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

POST myaggregation/_search
{
  "size": 0,
  "aggs": {
    "myaggs": {
      "terms": {
        "field": "key",
        "size": 10
      },
      "aggs": {
        "mynested": {
          "nested": {
            "path": "offers"
          },
          "aggs": {
            "found_savper": {
              "max": {
                "field": "offers.savper"
              }
            }
          }
        },
        "maxima":{
          "max": {
            "field": "sum_score"
          }
        },
        "sort": {
          "bucket_sort": {
            "sort": [
              { "maxima": { "order": "desc" }}
            ]
          }
        }
      }
    }
  }
}

Обратите внимание, что порядок сортировки при агрегировании maxima равен desc. Вы можете изменить его на asc в зависимости от вашего варианта использования.

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

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "myaggs" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "1002",
          "doc_count" : 2,
          "maxima" : {
            "value" : 4.0
          },
          "mynested" : {
            "doc_count" : 4,
            "found_savper" : {
              "value" : 4000.0
            }
          }
        },
        {
          "key" : "1001",
          "doc_count" : 2,
          "maxima" : {
            "value" : 2.0
          },
          "mynested" : {
            "doc_count" : 4,
            "found_savper" : {
              "value" : 4000.0
            }
          }
        }
      ]
    }
  }
}

Если вы удалите логику агрегации сортировки сегментов, вы заметите, что агрегация будет отсортирована по key.

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

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