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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(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值的嵌套对象

STEP 2

在获得这些嵌套对象之后,执行sum聚合,这样我就可以为相应的“ latest nested object”添加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:我无法执行进一步的汇总

样本输出Output 1

然后我尝试添加子聚合Output 2

然后这是输出Output 3

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

回顾我理想的步骤:

    访问我的
  1. eng
嵌套字段定位/关注
  • eng
  • 嵌套字段获取该
  • eng
  • 嵌套字段的“最新” /最新元素(由其同级date_updated字段的最大值指示)现在,在获得那些“最新”嵌套元素之后,对其兄弟嵌套字段进行子聚合,例如:获得以下所有最新元素的
  • soc_like_count
  • soc_share_count之和eng字段
    答案
    制定了答案!

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

    以上是关于(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素,然后执行子聚合的主要内容,如果未能解决你的问题,请参考以下文章

    使用 elasticsearchTemplate 从 ElasticSearch 获取所有文档

    使用 arrayFilters 更新 MongoDB 中的嵌套子文档

    Mongoose - 链接到相同类型的嵌套子文档

    Mongoose - 链接到相同类型的嵌套子文档

    Elasticsearch:获取 nested 类型数组中的所有元素

    Elasticsearch:获取 nested 类型数组中的所有元素