elasticsearch - 试图在聚合中找到最新的时间戳

时间:2016-10-06 14:33:35

标签: elasticsearch

我在时间戳字段中使用范围编写了弹性搜索查询。我需要找到每个组的最新时间戳。首先,我执行查询,然后按名称字段分组,然后尝试选择最新的时间戳。但它没有用。任何建议表示赞赏。下面是我的json,我用来搜索postman的帖子查询

{   “查询”:{         “range”:{“timestamp”:{“gte”:“2016-10-05T15:00:35”,“lte”:“2016-10-06T15:10:3​​5”}}     },

"aggs" : {
   "groupbyname" : { 
        "terms" : {
            "field" : "name"
            },  
            "aggs" : {
                "selectlatesttimestamp" :  {
                "max" : {
                    "field" : "timestamp"
                }
            }
        }

    }
}

}

1 个答案:

答案 0 :(得分:0)

您可以使用top-hits聚合来执行此操作,根据您的示例,您可以执行以下操作:

{
  "query": {
    "range": {
      "timestamp": {
        "gte": "2016-10-05T15:00:35",
        "lte": "2016-10-06T15:10:35"
      }
    }
  },
  "aggs": {
    "groupbyname": {
      "terms": {
        "field": "name"
      },
      "aggs": {
        "top_group_hits": {
          "top_hits": {
            "sort": [
              {
                "timestamp": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        }
      }
    }
  }
}

如果您未使用源自查询的实际结果,但仅使用聚合,您还可以将"size":0添加到顶级对象("query"上方)。< / p>

如果您只需要某些字段,则可以在热门点击聚合中添加_source部分,例如,如果您只需要获取最新的时间戳,则可以执行以下操作:

{
  "size": 0,
  "query": {
    "range": {
      "timestamp": {
        "gte": "2016-10-05T15:00:35",
        "lte": "2016-10-06T15:10:35"
      }
    }
  },
  "aggs": {
    "groupbyname": {
      "terms": {
        "field": "name"
      },
      "aggs": {
        "top_group_hits": {
          "top_hits": {
            "sort": [
              {
                "timestamp": {
                  "order": "desc"
                }
              }
            ],
            "_source": [
              "timestamp"
            ],
            "size": 1
          }
        }
      }
    }
  }
}