我绞尽脑汁想解决这个问题。一切似乎都已签出,但无法正常工作:(
我有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"
}
}
可以看到我有
我有以下查询:
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使用UTC日期/时间now
与索引的时间戳进行比较。
假设我比UTC落后5个小时,并且正在使用本地日期/时区为文档编制索引,那么我的查询实际上是在说“给我少于5个小时-从现在开始30分钟的日期。
这是我最终编写的查询,以查看它在字面上进行比较的值,以及为实现布尔查询内部的“预期”结果而要做的事情:
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)"
}
}
}
一个例子:
now
的UTC时间为11:41 pm,其“本地”时间为6:41 pm。ES文档中有很多地方提到它使用UTC中的日期,例如:
但是直到现在我还是完全不了解其中的含义。
在执行操作时,我只需要确保我的应用插入了UTC时间,尤其是在给定时区的情况下。
这是我的模型: 方法如下: 这是错误我得到当我尝试启动Spring应用程序 未能 在项目 licenta 上执行目标 org.springframework.boot:spring-boot-maven-plugin:1.5.9.RELEASE:run(default-cli) 在项目 licenta 上:运行时发生异常。 null: InvocationTargetException: 创建名为
问题内容: 我在mysql表中具有属性为“ ON UPDATE CURRENT_TIMESTAMP”的时间戳。有没有办法在特殊情况下手动禁用更新时间戳?(例如:更新条目以修改博客文章,但不重新添加日期) 问题答案: 有没有办法在特殊情况下手动禁用更新时间戳?(例如:更新条目以修改博客文章,但不重新添加日期) 听起来您需要配置默认约束,以便仅在插入时填充列: 将其更改为仅这意味着任何修订都不会触发时
我编写了一个简单的测试程序来插入一行。与普通HBase Put示例程序的唯一不同之处在于,Put实例及其KeyValue实例是用时间戳创建的。 预期的行为是插入行。但是,在我的HBase环境中,没有插入行。 下面是我的测试程序。 该程序生成的控制台输出如下所示。 而hbase shell中的“scan”表示“0行(s)”。
问题内容: 我在玩JPA(具体来说是Eclipselink)。下面的实体具有一个时间戳,应该在该实体上次更新时反映该时间戳。 每次更改此实体时,使JPA自动更新该时间戳的策略是什么? 如果我还想要一个“创建”时间戳记,该时间戳记仅在实体首次保留时设置,而永远不允许再次更改,该怎么办? 问题答案: 使用@PrePersist和@PreUpdate批注并编写您自己的事件侦听器。 详细了解一下此答案。它
我想查询cassandra timestamp列,例如this hour、last hour、beather。 我在mysql中执行了与昨天数据相同的查询