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

如何在Elasticsearch中按用户名排序用户最新登录聚合结果

解决方案:按用户名排序Elasticsearch用户聚合桶

原查询通过terms聚合按userid分桶,结合top_hits获取每个用户最新登录记录,但默认按文档计数排序,无法直接按用户名排序。要实现按用户名排序,需借助**bucket_sort聚合**结合子聚合提取用户名来实现。

修改后的查询代码

GET /login_history/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "fields": ["username", "fullname"],
            "query": "\"ayan\""
          }
        }
      ]
    }
  },
  "aggs": {
    "total_count": {
      "cardinality": {
        "field": "userid"
      }
    },
    "group_by_userId": {
      "terms": {
        "field": "userid",
        "size": 3,
        "include": {
          "partition": 0,
          "num_partitions": 2
        }
      },
      "aggs": {
        "latest_login": {
          "top_hits": {
            "_source": {
              "includes": ["username", "userid", "logintime"]
            },
            "sort": [
              {
                "logintime": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        },
        // 提取当前用户桶对应的用户名(需用keyword类型字段避免分词)
        "user_username": {
          "terms": {
            "field": "username.keyword",
            "size": 1
          }
        },
        // 按用户名对聚合桶排序
        "sort_by_username": {
          "bucket_sort": {
            "sort": [
              {
                "user_username.key": { "order": "asc" } // 升序,改为desc则为降序
              }
            ]
          }
        }
      }
    }
  }
}

关键说明

  • user_username子聚合:专门提取每个userid桶对应的用户名,必须使用username.keyword字段(需确保你的索引mapping中username包含keyword子字段,或本身是不分词的类型),防止分词导致的多值问题。
  • bucket_sort聚合:作为group_by_userId的子聚合,基于user_username.key的值对聚合桶排序,优先级高于terms聚合默认的排序规则。
  • 如需调整排序方向,将order的值改为desc即可实现用户名降序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:37:09