(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:我无法执行进一步的汇总嵌套字段定位/关注还有其他方法可以执行此操作吗?
回顾我理想的步骤:
访问我的
- 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 中的嵌套子文档