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

Suomynona

我有一个名为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查询来过滤出这些嵌套对象

步骤1
获取具有最高date_updated的嵌套对象

步骤2
在获得这些嵌套对象之后,执行求和汇总,以便为相应的“最新嵌套对象”添加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:我无法执行进一步的聚合

样本输出
输出1

然后我尝试添加子聚合
输出2

然后这是输出 输出3

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

回顾我的理想步骤:

  1. 访问我的英语嵌套字段
  2. 获取该eng嵌套字段的“最新” /最新元素(由date_updated字段的最大值表示
  3. 现在,在获取到那些“最新”嵌套元素之后,对其兄弟嵌套字段进行子聚合,例如:获取eng字段中所有最新元素soc_like_countsoc_share_count的总和
Suomynona

制定了答案!

"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
                """
            }
        }
      }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Elasticsearch获取最后一个嵌套或最近嵌套的元素

在Mongoose中,如何找到与给定查询值匹配的数组字段的最后一个元素的所有文档?

Elasticsearch聚合中第一个和最后一个文档的返回字段

如何在mongodb中获取子文档中的最后一个元素

在Solr中,如何获取所有文档的一个字段列表(文档ID)?

从MongoDB中的所有文档中获取数组字段的第一个元素的总和

我如何才能从各个级别的子文档中获取一个子文档字段及其所有_id?

如何仅返回数组的最后一个元素而不获取所有元素

我如何使用jQuery获取除最后一个元素以外的所有元素

ElasticSearch - 如何获取文档的所有字段?

GroupBy Column1,然后使用Column2上的第一个/最后一个元素获取所有元素(Python)

Elasticsearch获取给定字段的最后一个文档(如果存在)

在elasticsearch聚合中每个bucket获取一个文档

如何查询数组字段至少有一个属性等于“X”的对象元素的所有文档?

Scala / Spark-如何获取所有子数组的第一个元素

如何填充作为另一个文档的数组元素的子文档的字段?

Elixir-如何获取除列表中的最后一个元素以外的所有元素?

如何使用 MongoDB 聚合框架获取最后一个子字符串?

如何使click事件功能从最后一个子元素开始,然后逐步上升?

我们如何从 elasticsearch 索引中获取最后一个文档?

MongoDB在聚合查询中获取第一个和最后一个文档

Elasticsearch,如何获取一个字段的所有唯一值并计算总唯一值?

如何获取嵌套列表中的所有元素,其中每个列表的第一个元素是特定数字?

获取除最后一个元素之外的所有元素 - JS

firebase / 我如何从 firestore / javascript 中的所有文档中获取一个字段

如何从MySQL JSON文档中的最后一个元素获取值?

如何显示元素内元素的所有对象,直到 Angular 中的最后一个元素?

Vim:如何对整个文档执行最后一个操作?

如何获取R中列表的每个元素的最后一个子元素