gpt4 book ai didi

elasticsearch - 查询以提取超过30m年前更新的时间戳不起作用

转载 作者:行者123 更新时间:2023-12-02 22:29:47 26 4
gpt4 key购买 nike

我绞尽脑汁想解决这个问题。一切似乎都已 checkout ,但无法正常工作:(

我有以下文件的索引test-index:

{
"_index": "test-index",
"_type": "testType",
"_id": "AV33b_VYUyX1XZAq7NTI",
"_score": 1,
"_source": {
"timestamp": "2017-08-17T17:56:55"
}
},
{
"_index": "test-index",
"_type": "testType",
"_id": "AV33cBN4UyX1XZAq7NTJ",
"_score": 1,
"_source": {
"timestamp": "2017-08-18T17:11:12"
}
},
{
"_index": "test-index",
"_type": "testType",
"_id": "AV33cetJUyX1XZAq7NTK",
"_score": 1,
"_source": {
"timestamp": "2017-08-19T17:11:12"
}
}

可以在这里看到我有
  • 理论上最后一次更新的文档。
  • 今天(08/18)20分钟前(在撰写本文时为17:30)最近更新的文档
  • 明天“最后更新”的文档,只是为了说明为什么我感到困惑,为什么它不起作用。

  • 我有以下查询:
    GET test-index/testType/_search?pretty
    {
    "query": {
    "range": {
    "timestamp": {
    "lte": "now-30m"
    }
    }
    }
    }

    它拉出今天(20分钟前)更新的记录,以及昨天更新的记录。我希望它只会在昨天刷新记录。
    "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
    {
    "_index": "test-index",
    "_type": "testType",
    "_id": "AV33b_VYUyX1XZAq7NTI",
    "_score": 1,
    "_source": {
    "timestamp": "2017-08-17T17:56:55"
    }
    },
    {
    "_index": "test-index",
    "_type": "testType",
    "_id": "AV33cBN4UyX1XZAq7NTJ",
    "_score": 1,
    "_source": {
    "timestamp": "2017-08-18T17:11:12"
    }
    }
    ]

    将查询更改为 gte now-30m,它可以按预期工作,并以明天的时间戳提取记录。如果我也将其更改为 lte now-1d,则范围查询正常工作,仅显示预期的08/17记录,但我想使用一分钟作为截止时间。当我尝试做几个小时时,也可以观察到相同的不当行为。

    我试过将格式设置为 yyyy-MM-dd HH:mm:ss并接受ES的默认日期映射,但是没有运气。

    有人知道这里可能出什么问题吗?

    编辑:它似乎也拉记录为“今天”,但将来的某个时间,例如:
     {
    "_index": "test-index",
    "_type": "testType",
    "_id": "AV33gSs6UyX1XZAq7NTS",
    "_score": 1,
    "_source": {
    "timestamp": "2017-08-18 19:11:12"
    }
    }

    这似乎是一个精确的问题,我只是不知道问题是什么,因为一切似乎都是正确的。

    最佳答案

    我想我最终找到了根本原因。在为文档建立索引时,ES会将提供的值视为UTC日期/时间。查询时,ES使用now的UTC日期/时间与索引的时间戳进行比较。

    假设我比UTC落后5个小时,并且正在使用本地日期/时区为文档编制索引,那么我的查询实际上是在说“给我少于5个小时-从现在开始30分钟的日期。

    这是我最终编写的查询,以查看它在字面上进行比较的值,以及为实现 bool(boolean) 查询内部的“预期”结果而要做的事情:

    GET test-index/testType/_search?pretty
    {
    "query": {
    "bool" : {
    "must" : {
    "script" : {
    "script" : {
    "inline": "doc['timestamp'].value < new Date().getTime() - (5 * 60 * 60 * 1000) - (120 * 60 * 1000)",
    "lang": "painless"
    }
    }
    }
    }
    },
    "script_fields": {
    "timestampValue" : {
    "script" : "doc['timestamp'].value"
    },
    "valueTimestampMustBeLessThan" : {
    "script" : "new Date().getTime() - (120 * 60 * 1000)"
    },
    "now" : {
    "script" : "new Date().getTime()"
    },
    "subtract": {
    "script": "(120 * 60 * 1000)"
    },
    "timestamp" : {
    "script" : "doc['timestamp']"
    },
    "lt?" : {
    "script" : "doc['timestamp'].value < new Date().getTime() - (120 * 60 * 1000)"
    },
    "gt?" : {
    "script" : "doc['timestamp'].value > new Date().getTime() - (120 * 60 * 1000)"
    }
    }
    }

    一个例子:
  • 我在2017年8月18日下午6:40左右插入的文档读取其UTC时间为该时间,而其“本地”时间为1:40 pm。
  • 我在2017年8月18日下午6:41左右运行的查询读取now的UTC时间为11:41 pm,其“本地”时间为6:41 pm。

  • ES文档中有很多地方提到它使用UTC中的日期,例如:
  • https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
  • https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html#CO160-2

  • 但是直到现在,我还是完全不了解其中的含义。

    在执行操作时,我只需要确保我的应用插入了UTC时间,尤其是在给定时区的情况下。

    关于elasticsearch - 查询以提取超过30m年前更新的时间戳不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765887/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com