Elasticsearch 查询 - 每个用户的最新日志,字段 logtype='x'

Elasticsearch query - Most recent log for each user, for field logtype='x'

我正在尝试查询 elasticsearch 以获取所有用户 ID 的最新日志,其中我们只为每个用户包含一个日志,字段为 logtype='x'

if logtype='x' 然后为每个用户 ID 获取 1 个日志,其中此日志的日期是每个用户 ID 的最新日期

示例日志:{"logtype"="x", "number":232423, "userID":123, "time":"2021-02-03T20:25:44.603045+05:30"}

如何创建此查询?

假设您的索引映射如下所示:

{
  "properties" : {
    "logtype" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "number" : {
      "type" : "long"
    },
    "time" : {
      "type" : "date"
    },
    "userID" : {
      "type" : "long"
    }
  }
}

您将需要这些聚合:terms ordered by the result of a max, plus a top_hits 以获取每个用户 ID 的最新日志:

POST logs/_search
{
  "size": 0,
  "query": {
    "match": {
      "logtype": "x"
    }
  },
  "aggs": {
    "by_user_id": {
      "terms": {
        "field": "userID",
        "size": 1,
        "order": {
          "latest_date": "desc"
        }
      },
      "aggs": {
        "latest_date": {
          "max": {
            "field": "time"
          }
        },
        "latest_log": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "time": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}