Json 小值的Elasticsearch查询范围精度问题
我有一个数据库,其中有几千个时间戳对,我想查询和过滤。典型的时间戳是:Json 小值的Elasticsearch查询范围精度问题,json,
elasticsearch,Json,
elasticsearch,我有一个数据库,其中有几千个时间戳对,我想查询和过滤。典型的时间戳是: 2019-06-15T15:09:14.0191875+02:00 2019-06-15T15:09:14.0195000+02:00 2019-06-15T15:09:14.0194375+02:00 2019-06-15T15:09:14.0198750+02:00 2019-06-15T15:09:14.0190000+02:00 2019-06-15T15:09:14.0190625+02:00 2019-06-15
2019-06-15T15:09:14.0191875+02:00
2019-06-15T15:09:14.0195000+02:00
2019-06-15T15:09:14.0194375+02:00
2019-06-15T15:09:14.0198750+02:00
2019-06-15T15:09:14.0190000+02:00
2019-06-15T15:09:14.0190625+02:00
2019-06-15T15:09:14.0191875+02:00
如您所见,它们仅在微秒范围内变化。当我使用以下查询时,我会收到所有这些值
{
"size": 500,
"sort": [
{
"timestamp": {
"order": "desc"
}}],
"query": {
"range": {
"timestamp": {
"time_zone": "+02:00",
"gt": "2019-06-15T15:09:14.01",
"lt": "2019-06-15T15:09:14.02"
}
}
}
}
当我将gt和lt更改为例如“2019-06-15T15:09:14.0191”和“2019-06-15T15:09:14.0196”时,结果为空。值查询也会发生同样的情况
65.59359741210938
0.149688720703125
0.0748443603515625
0.014968873001635075
0.2395019680261612
如果我使用这个查询
{
"size": 1000,
"sort": [
{
"value": {
"order": "asc"
}
}
],
"query": {
"range" : {
"value": {
"gte": 0
}
}
}
}
我得到的结果包括上述值。当我将gte更改为0.02并添加“lte”:0.09时,结果为空。有人能解释一下我做错了什么吗?好问题。您的
时间戳
可能是日期
类型,它以毫秒分辨率存储日期。所以你需要的是
删除索引,将映射更改为
{
"mappings": {
"properties": {
"timestamp": {
"type": "date_nanos"
}
}
}
}
然后重新编制索引,你就可以出发了
请注意,这仅在7.0及更高版本中受支持 这个@FredFloete运气好吗?我还在努力。等我弄明白了,我会赶上你的!嘿,又是我。我发现了我的一些问题。首先,这个具体例子中使用的版本是5.6.14,因此没有机会用你的答案解决日期问题。其次,值字段的空结果是由错误的映射引起的,该映射被设置为“long”,应该是“double”或“float”。是的,它只有5.6。很高兴你找到了答案。纯数字字段(而不是带有格式的
date
)的唯一缺点是,虽然您可以对其进行简单的range
查询,但它们不能是相对的(如now-1y
)。此外,直方图聚合是不可能的(脚本除外),加上时区可能不是最容易实现的。但看起来你只是在这里做范围查询,所以你应该没事。谢谢@Joe帮我解答了一些问题。这也是为什么我不能搜索精确的时间戳(具有给定的ns精度)的问题吗?大多数情况下,我的查询包含范围或精确的时间戳,每次我得到包含其他时间戳或超出范围的结果时。