Могу ли я передать результат агрегации в агрегацию диапазона? - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующий набор данных

    [
      {
        "rating": "10",
        "subject": "maths"
      },
      {
        "rating": "9",
        "subject": "physics"
      },
      {
        "rating": "10",
        "subject": "chemistry"
      },
      {
        "rating": "5",
        "subject": "physics"
      },
      {
        "rating": "2",
        "subject": "geography"
      },
      {
        "rating": "5",
        "subject": "maths"
      },
      {
        "rating": "1",
        "subject": "geography"
      },
      {
        "rating": "5",
        "subject": "maths"
      }, 
      {
        "rating": "8",
        "subject": "chemistry"
      }
    ] 

Что мне нужно сделать, так это найти среднюю оценку по каждому предмету, а затем рассчитать количество предметов в диапазонах оценок (0-2,2-5,5-8,8-10) с помощью эластичного поискового запроса. .

Мой запрос создает группы для каждого субъекта, вычисляя среднее значение для каждой группы. Но я не могу найти, как выполнить агрегацию диапазона по результату составной агрегации. Это вообще возможно? Есть ли альтернатива?

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

GET kibana_sample/_search
{
  "size":0,
    "aggs" : {
        "my_buckets": {
            "composite" : {
                "sources" : [
                    { "subject": { "terms" : { "field": "subject" } } }
                ]
            },
            "aggs": {
              "avg_rating": {
                "avg" : { "field" : "rating" }
              }
            }
         }
     }
} 

Это приводит к следующему.

"aggregations": {
    "my_buckets": {
      "buckets": [
        {
          "key": {
            "subject": "maths"
          },
          "doc_count": 3,
          "avg_rating": {
            "value": 6.66666667
          }
        },
        {
          "key": {
            "subject": "physics"
          },
          "doc_count": 2,
          "avg_rating": {
            "value": 7
          }
        },
        {
          "key": {
            "subject": "chemistry"
          },
          "doc_count": 2,
          "avg_rating": {
            "value": 9
          }
        },
        {
          "key": {
            "subject": "geography"
          },
          "doc_count": 2,
          "avg_rating": {
            "value": 1.5
          }
        }
      ]
   }
}

Это все хорошо, но теперь мне нужно выполнить агрегацию диапазонов поверх этого результата, чтобы получить количество предметов в диапазонах оценок. например:

диапазон оценок: {0-2}: 1 предмет, {2-5}: 0 предметов, {5-8}: 2 предмета, {8-10}: 1 предмет

1 Ответ

0 голосов
/ 09 января 2019

Вы можете использовать конвейерные агрегации для объединения одного результата агрегации через несколько агрегаций. Другая вещь, которую вы можете сделать, это использовать сценарии в конвейере, чтобы отфильтровать только релевантные результаты.

Ознакомьтесь с примерами скриптов здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline.html

...