如何在Elasticsearch中过滤汇总结果?

时间:2020-09-06 15:39:56

标签: elasticsearch

我有一个带有两个字段的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的值?

1 个答案:

答案 0 :(得分: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变量,但这没关系。