elasticsearch,Json,elasticsearch" /> elasticsearch,Json,elasticsearch" />

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精度)的问题吗?大多数情况下,我的查询包含范围或精确的时间戳,每次我得到包含其他时间戳或超出范围的结果时。