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

标签 php 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 查询来过滤掉这些嵌套对象

第 1 步
获取具有最高 date_updated

的嵌套对象

第 2 步
获取这些嵌套对象后,执行 sum 聚合,以便我可以添加相应“最新嵌套对象”soc_mm_score 字段的所有值

我尝试过这个查询,但似乎失败了

尝试#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:它返回正确的嵌套对象 缺点:我无法执行进一步的聚合

示例输出
Output 1

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

然后这是输出 Output 3

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

回顾我的理想步骤:

  1. 访问我的eng嵌套字段
  2. 获取该 eng 嵌套字段的“最新”/最新元素(由具有 date_updated 字段最高值的元素表示)
  3. 现在,在获取这些“最新”嵌套元素后,对其同级嵌套字段进行子聚合,例如:获取 soc_like_countsoc_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
                """
            }
        }
      }

关于php - (Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58797633/

相关文章:

php - 403 FORBIDDEN ajax 调用脚本

php - jQuery ajax 在发布多个数据时不返回任何内容

javascript - php 数组到 javascript 数组(从函数调用)

php - 在 joomla 3 模板中使用 php 的 css 变量

elasticsearch - script_field中的值不返回 native 值

maven - 使用Eclipse通过JAVA API访问Elasticsearch

php - 如何使用 php 对 id 进行分组并内联日期

elasticsearch - 麋鹿。找不到嵌套值

scala - 更新映射定义是使用Scala的ELasticSearch

python-2.7 - Elasticsearch DSL:过滤,然后在python中聚合