【问题标题】:elasticsearch - trying to find latest time stamp in aggregationelasticsearch - 试图在聚合中找到最新的时间戳
【发布时间】:2016-10-06 14:33:34
【问题描述】:

我使用时间戳字段的范围在弹性搜索中编写了一个查询。我需要找到每个组的最新时间戳。首先我执行查询,然后按名称字段分组,然后尝试选择最新的时间戳。但它不起作用。任何建议表示赞赏。下面是我用于从邮递员搜索 Post 查询的 json

{ “询问” : { “范围”:{“时间戳”:{“gte”:“2016-10-05T15:00:35”,“lte”:“2016-10-06T15:10:35”}} },

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

    }
}

}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用 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" 上方)。

    如果您只需要一些字段,您可以在热门点击聚合中包含一个_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
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 谢谢,看起来它应该可以工作,但由于某种原因,它仍会在该时间范围内返回多个具有相同名称的文档。我想知道它是否与我们定义时间戳或映射它的方式有关。这是我们如何定义“名称”和“时间戳”的 JSON 没有什么不寻常的......“名称”:{“类型”:“字符串”},“时间戳”:{“类型”:“日期”,“格式” : "strict_date_optional_time||epoch_millis" }
    • 这就是我获得结果集的方式:jsonblob.com/57f69a7ee4b0bcac9f7b677d 这对我来说看起来不错,我每组获得 1 个文档,其中包含最新的时间戳。请务必注意,您的 name 字段也应设置为 "index": "not_analyzed" 否则 Elasticsearch 将标记内容并可能创建额外的存储桶,因此如果您有一个带有 name: "new york" 的文档,它将显示两个存储桶,一个用于“新",一个代表“约克”。
    猜你喜欢
    • 2021-02-05
    • 2018-01-24
    • 2019-08-06
    • 1970-01-01
    • 2018-05-14
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多