You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中结合聚合与排序查找重复值并获取最新数据

Elasticsearch 按指定字段去重取最新数据实现方案

问题根因

现有查询不生效的核心原因是top_hits聚合未指定按更新时间排序,默认返回相关性评分最高的文档,而非时间最新的;同时叠加了大量多余的重复聚合逻辑,干扰了结果输出。

修正后的查询语句

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "BILLING_TYPE_CD": "Service Bundle"
          }
        },
        {
          "match": {
            "ID": "xxxx"
          }
        },
        {
          "exists": {
            "field": "LI_MILESTONE"
          }
        },
        {
          "exists": {
            "field": "LI_SID"
          }
        },
        {
          "query_string": {
            "default_field": "LI_SID",
            "query": "*xxxx*"
          }
        }
      ],
      "must_not": {
        "bool": {
          "must": [
            {
              "query_string": {
                "default_field": "LI_PRODUCT_NAME",
                "query": "*Network*"
              }
            },
            {
              "terms": {
                "LI_MILESTONE.keyword": [
                  "Abandoned",
                  "Cancelled"
                ]
              }
            },
            {
              "terms": {
                "ORDER_STATUS.keyword": [
                  "Abandoned",
                  "Cancelled",
                  "Drop In Progress"
                ]
              }
            },
            {
              "term": {
                "STATUS.keyword": ""
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "group_by_lisid": {
      "terms": {
        "field": "LI_SID.keyword",
        "size": 50000,
        // 若需要分组整体按最新时间排序,打开下方注释,同时保留aggs中的max_update_time聚合
        // "order": {
        //   "max_update_time": "desc"
        // }
      },
      "aggs": {
        // 可选:用于分组整体排序
        "max_update_time": {
          "max": {
            "field": "LAST_UPDATE"
          }
        },
        "latest_record": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "LAST_UPDATE": {
                  "order": "desc"
                }
              }
            ],
            "_source": {
              "includes": [
                "LAST_UPDATE",
                "xxxxx",
                "xxxxx",
                "xxxxx",
                "xxx"
              ]
            }
          }
        }
      }
    }
  }
}

关键修改说明

  • 移除了冗余的composite复合聚合、重复的terms分组逻辑,直接使用一级terms聚合按LI_SID.keyword分组,每个聚合桶对应同一个LI_SID的所有文档,天然实现去重
  • 给top_hits聚合内部添加LAST_UPDATE字段倒序排序规则,保证每个分组返回的第一条就是该组下最新的文档
  • 原查询根节点的sort规则仅作用于原始查询命中的文档,不影响聚合内部的文档排序,因此之前的配置不会生效
  • 若需要对最终的分组结果整体按最新时间排序,可打开terms聚合中order的注释,配合max_update_time聚合即可实现

内容的提问来源于stack exchange,提问作者Aminudin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:30:04