(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

我有一个名为 socialmedia 的索引,并尝试使用名为 eng 的该字段创建查询(省略了一些不必要的字段)

"id" : "1","eng": 
[
{
  "soc_mm_score" : "3","date_updated" : "1520969306",},{
  "soc_mm_score" : "1","date_updated" : "1520972191",{
  "soc_mm_score" : "4","date_updated" : "1520937222",}
]

此索引中有很多个文档,其中包含 eng 嵌套字段,其中还包含很多“子对象”

现在,我的主要目标是,我应该制定什么样的Elasticsearch查询来过滤掉这些嵌套对象

STEP 1
获取具有最高 date_updated

的嵌套对象

第2步
在获得这些嵌套对象之后,执行一次 sum 聚合,以便为相应的“最新嵌套对象” 添加 soc_mm_score 字段的所有值。

我已经尝试过该查询,但似乎失败了

ATTEMPT#1 (我使用的是Elasticsearch-php API,因此请相信我的查询,它可以使用这种格式)

'aggs' => [
    'ENG' => [
        'nested' => [
            'path' => 'eng'
        ],'aggs' => [
            'FILTER' => [
                'filter' => [
                    'bool' => [
                        'must' => [
                            [
                                // I'm thinking of using max aggregation here
                            ]
                        ]
                    ]
                ]
            ]
            'LATEST' => [
                'top_hits' => [
                    'size' => 1,'sort' => [
                        'eng.date_updated' => [
                            'order' => 'desc'
                        ]
                    ]
                ]
            ]
        ]
    ]
]

PRO / S:它返回正确的嵌套对象 CON / S:我无法进行进一步的汇总

样本输出

(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

然后我尝试添加子聚合

(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

然后这是输出

(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

还有其他方法可以执行此操作吗?

回顾我理想的步骤:

  1. 访问我的 eng 嵌套字段
  2. 获取该 eng 嵌套字段的“最新” /最新元素(由具有 date_updated 字段的最大值的元素表示)
  3. 现在,在获取这些“最新”嵌套元素之后,对其兄弟嵌套字段进行子聚合,例如:获取 soc_like_count soc_share_count 的总和 eng 字段
  4. 中所有最近的元素
keke0328 回答:(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

制定了答案!

"aggs":{
        "LATEST": {
            "scripted_metric": {
                "init_script" : """
                  state.te = []; 
                  state.g = 0;
                  state.d = 0;
                  state.a = 0;
                ""","map_script" : """
                  if(state.d != doc['_id'].value){
                      state.d = doc['_id'].value;
                      state.te.add(state.a);
                      state.g = 0;
                      state.a = 0;
                  } 
                  if(state.g < doc['eng.date_updated'].value){ 
                    state.g = doc['eng.date_updated'].value; 
                    state.a = doc['eng.soc_te_score'].value;
                  }
                  ""","combine_script" : """
                    state.te.add(state.a);
                    double count = 0; 
                    for (t in state.te) { 
                      count += t 
                    }

                    return count
                  ""","reduce_script" : """
                    double count = 0; 
                    for (a in states) { 
                      count += a 
                    }

                    return count
                """
            }
        }
      }
本文链接:https://www.f2er.com/3125728.html

大家都在问