Как агрегировать скриптовое поле в эластичном поиске?

#elasticsearch #aggregate #aggregation

#elasticsearch #агрегировать #агрегация

Вопрос:

Вычисляемая категория — это скриптовое поле в запросе. Я хочу выполнить еще один уровень агрегации для этого скриптового поля. Возможно ли это? Если да, пожалуйста, помогите мне.

Мой запрос :-

 {
  "from": 0,
  "size": 0,
  "query": {
    "bool": {}
  },
  "aggs": {
    "stakeholder_category": {
      "terms": {
        "field": "stakeholder_level",
        "size": 214748364
      },
      "aggs": {
        "Coverage-Calculation": {
          "terms": {
            "field": "stakeholder_name",
            "size": 214748364
          },
          "aggs": {
            "Total-Hours": {
              "sum": {
                "field": "field_capacity_building_duration"
              }
            },

                    "include_source": {
                      "top_hits": {
                        "size": 1,
                        "_source": {
                          "includes": [
                            "state_location",
                            "district_location"
                          ]
                        }
                      }
                    },
           
                    "Calculated-Category": {
                    "bucket_script": {
                      "buckets_path": {
                        "NumberOfEngagements": "_count",
                        "TotalHours":"Total-Hours"
                      },
                      
                      "script": {
                      "lang": "painless",
                      "source": """

                          if (params.TotalHours >= 20 amp;amp; params.NumberOfEngagements >= 2) {
                          return 1;  
                        } else if(params.TotalHours >3) {
                          return 2 ;  
                        }
                          else if(params.TotalHours >3) {
                          return 2 ;  
                        }
                          else if(params.TotalHours >=1 amp;amp; params.TotalHours <=3) {
                          return 3 ;  
                        }
                        else if(params.TotalHours ==0) {
                          return 4 ;  
                        }
                        
                """
                }
              }
            }
          }
        }
      }
    }
  }
}
  

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

Результат приведенного выше запроса будет примерно таким

 {
                "key" : "CHUNUSINGH GAUTAM",
                "doc_count" : 1,
                "include_source" : {
                  "hits" : {
                    "total" : 1,
                    "max_score" : 1.0,
                    "hits" : [
                      {
                        "_index" : "elasticsearch_index_apffatest_coverage_new",
                        "_type" : "coverage_new",
                        "_id" : "entity:paragraph/3826125:en",
                        "_score" : 1.0,
                        "_source" : {
                          "district_location" : [
                            "Raipur"
                          ],
                          "state_location" : [
                            "Chhattisgarh"
                          ]
                        }
                      }
                    ]
                  }
                },
                "Total-Hours" : {
                  "value" : 0.0
                },
                "Calculated-Category" : {
                  "value" : 4.0
                }
              },
              {
                "key" : "SAVITA DHSH test",
                "doc_count" : 1,
                "include_source" : {
                  "hits" : {
                    "total" : 1,
                    "max_score" : 1.0,
                    "hits" : [
                      {
                        "_index" : "elasticsearch_index_apffatest_coverage_new",
                        "_type" : "coverage_new",
                        "_id" : "entity:paragraph/3747567:en",
                        "_score" : 1.0,
                        "_source" : {
                          "district_location" : [
                            "Raipur"
                          ],
                          "state_location" : [
                            "Chhattisgarh"
                          ]
                        }
                      }
                    ]
                  }
                },
                "Total-Hours" : {
                  "value" : 3.0
                },
                "Calculated-Category" : {
                  "value" : 3.0
                }
              }
  

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

Комментарии:

1. Каков ожидаемый результат? Не сразу понятно, чего вы хотите достичь.

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