当前位置: 首页 > 知识库问答 >
问题:

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

姬奇思
2023-03-14

我有一个名为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字段的所有值。

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

尝试#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. 访问我的eng嵌套字段
  2. 获取该eng嵌套字段的“最新”/最近元素(由date_updated字段值最高的元素指示)
  3. 现在,在获得这些“最近的”嵌套元素之后,为其同级嵌套字段进行子聚合,例如:获取eng字段所有最近元素的soc_like_count或soc_share_count的总和

共有1个答案

吴哲
2023-03-14

制定了一个答案!

"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索引,其中每个文档代表一个国家。Country具有城市字段,该字段定义为嵌套的。 示例映射(为了本示例的简洁性而简化): 我插入到索引中的文档如下所示: 是否可以组成一个返回所有城市(所有国家)并支持排序的查询 第一个返回页面(回复)将包含捷克共和国的10个城市,第二个页面将包含10个城市,其中四个(最后一个)来自捷克共和国,六个来自斯洛伐克。 我正在研究复

  • 我能够在弹性搜索 6.8 中使用聚合查询获取数据库中文本字段的所有值: 我正在尝试为嵌套字段做同样的事情。 下面是文本字段(城市)和嵌套字段(冷却)的示例 下面是我一直引用的文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-bucket-terms-aggregation.html

  • 我有一个简短的问题,似乎很简单,但到目前为止我还找不到任何答案。 我想在Elasticsearch节点上检索给日期字段的最后一个文档。但是我想有最后一个文档,只针对包含特定字段的文档。 例如,假设我想获得包含“PromotionCode”字段的最后一笔购买: 查询: 在store1是我的索引的地方,购买文档类型。 现在让我们假设我的ElasticSearch中有这两个文档: 如果我想获得最后一个文

  • 我有带有实体和嵌套实体的索引。实体由、和嵌套变体组成。实体由、和字段组成。我需要按、和字段聚合搜索结果,以获得每个颜色、大小和价格组的产品数量。如果我对这些字段使用嵌套聚合,我会得到正确的buckes,但是bucket中的文档数是每个bucket的实体数。但是我需要获得每个bucket的实体(根文档)的数量。 例如,第一个产品有变体(红色,小,$10)、(绿色,小,$10)、(红色,中等,$11)

  • 提取切片的最后一个元素的方式是什么? 上述解决方案可行,但似乎有些尴尬。