【问题标题】:How to filter aggregation results in Elasticsearch?如何在 Elasticsearch 中过滤聚合结果?
【发布时间】:2020-09-06 15:39:56
【问题描述】:

我有一个包含两个字段的 Elasticsearch 索引“会话”:

  "user_id" : {
    "type" : "keyword"
  },
  "login_at" : {
    "type" : "date"
  }

每次用户登录时,都会创建一条带有 user_id 和当前时间戳的新记录。

我想列出一周未登录的所有用户。我知道如何获取每个用户的最后登录时间:

GET sessions/_search
{
  "size": 0,
  "aggs": {
    "user_aggs": {
      "terms": {
        "field": "user_id",
        "order": {
           "last_access": "asc"
        }
      },
      "aggs": {
        "last_access": {
          "max": {
            "field": "login_at"
          }
        }
      }
    }
  }
}

上面的查询列出了所有用户及其上次登录时间。

如何将“last_access”字段过滤为小于 now-7d 的值?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    好的,我能够解决这个问题。这是查询:

    GET sessions/_search
    {
      "size": 0,
      "aggs": {
        "user_aggs": {
          "terms": {
            "field": "user_id",
            "size": 1000,
            "order": {
               "last_access": "asc"
            }
          },
          "aggs": {
            "last_access": {
              "max": {
                "field": "login_at"
              }
            },
            "users_filtered": {
              "bucket_selector": {
                "buckets_path": {
                  "key": "last_access"
                },
                "script": "params.key < a_timestamp"
              }
            }
          }
        }
      }
    }
    

    a_timestamp 变量必须从应用程序发送,但这没关系。

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多