Сортировка Elasticsearch по формуле со значениями из вложенных агрегатов

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

Я хочу отсортировать по этой формуле результат:

national_averages_9_10.avg * national_averages_9_10.count / key.doc_count

где key.doc_count = количество документов корневого сегмента

Более конкретно, для первого итогового документа формула имеет вид:

9,543799991607665 * 100 / 194 = 4,919484

У меня есть следующий поиск:

GET student-grade/_search
{
  "size": 0,
  "aggs": {
    "schools": {
      "terms": {
        "field": "SCHOOL_NAME.keyword",
        "size": 2,
        "shard_size": 250,
        "min_doc_count": 20
      },
      "aggs": {
        "national_averages_9_10": {
          "filter": {
            "range": {
              "STUDENT_NATIONAL_AVERAGE_GRADE": {
                "gte": 9,
                "lte": 10
              }
            }
          },
          "aggs": {
            "range_stats": {
              "stats": {
                "field": "STUDENT_NATIONAL_AVERAGE_GRADE"
              }
            }
          }
        }
      }
    }
  }
}

Это производит этот пример вывода:

  "aggregations": {
    "schools": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 10790,
      "buckets": [
        {
          "key": "Școala Gimnazială nr. 195",
          "doc_count": 194,
          "national_averages_9_10": {
            "doc_count": 100,
            "range_stats": {
              "count": 100,
              "min": 9.020000457763672,
              "max": 10,
              "avg": 9.543799991607665,
              "sum": 954.3799991607666
            }
          }
        },
        {
          "key": "Școala Gimnazială nr. 56",
          "doc_count": 178,
          "national_averages_9_10": {
            "doc_count": 110,
            "range_stats": {
              "count": 110,
              "min": 9,
              "max": 10,
              "avg": 9.566909139806574,
              "sum": 1052.3600053787231
            }
          }
        }
      ]
    }
  }

1 ответ

{
  "size": 0,
  "aggs": {
    "schools": {
      "terms": {
        "field": "SCHOOL_NAME.keyword"
      },
      "aggs": {
        "national_averages_9_10": {
          "filter": {
            "range": {
              "STUDENT_NATIONAL_AVERAGE_GRADE": {
                "gte": 9,
                "lte": 10
              }
            }
          },
          "aggs": {
            "range_stats": {
              "stats": {
                "field": "STUDENT_NATIONAL_AVERAGE_GRADE"
              }
            }
          }
        },
        "my_formula": {
          "bucket_script": {
            "buckets_path": {
              "school_total_count": "_count",
              "average_9_10_total_count": "national_averages_9_10._count",
              "average": "national_averages_9_10>range_stats.avg"
            },
            "script": "params.average * params.average_9_10_total_count / params.school_total_count"
          }
        }
      }
    }
  }
}
Другие вопросы по тегам