您现在的位置:首页 > >

es查询时间long转date_ES 22

发布时间:

1 范围查询的符号


符号


含义


gte


greater-than or equal to, 大于或等于


gt


greater-than, 大于


lte


less-than or equal to, 小于或等于


lt


less-than, 小于


2 数值范围查询


需求: 查询商品中40 <= price <= 80的文档:


GET book_shop/_search


{


"query": {


"range": {


"price": {


"gte": 40,


"lte": 80,


"boost": 2.0 // 设置得分的权重值(提升值), 默认是1.0


}


}


}


}


3 时间范围查询


3.1 简单查询示例


需求: 查询网站中最*一天发布的博客:


GET website/_search


{


"query": {


"range": {


"post_date": {


"gte": "now-1d/d", // 当前时间的上一天, 四舍五入到最*的一天


"lt": "now/d" // 当前时间, 四舍五入到最*的一天


}


}


}


}


3.2 关于时间的数学表达式(date-math)


Elasticsearch中时间可以表示为now, 也就是系统当前时间, 也可以是以||结尾的日期字符串表示.


在日期之后, 可以选择一个或多个数学表达式:


+1h ?? 加1小时;


-1d ?? 减1天;


/d ?? 四舍五入到最*的一天.


下面是Elasticsearch支持数学表达式的时间单位:


表达式


含义


表达式


含义


y



M



w


星期


d



h


小时


H


小时


m


分钟


s



说明: 假设系统当前时间now = 2018-10-01 12:00:00 :


now+1h: now的毫秒值 + 1小时, 结果是: 2018-10-01 13:00:00.


now-1h: now的毫秒值 - 1小时, 结果是: 2018-10-01 11:00:00.


now-1h/d: now的毫秒值 - 1小时, 然后四舍五入到最*的一天的起始, 结果是: 2018-10-01 00:00:00.


2018.10.01||+1M/d: 2018-10-01的毫秒值 + 1月, 再四舍五入到最*一天的起始, 结果是: 2018-11-01 00:00:00.


3.3 关于时间的四舍五入


对日期中的日、月、小时等 进行四舍五入时, 取决于范围的结尾是包含(include)还是排除(exclude).


向上舍入: 移动到舍入范围的最后一毫秒;


向下舍入: 一定到舍入范围的第一毫秒.


举例说明:


① "gt": "2018-12-18||/M" ?? 大于日期, 需要向上舍入, 结果是2018-12-31T23:59:59.999, 也就是不包含整个12月.


② "gte": "2018-12-18||/M" ?? 大于或等于日期, 需要向下舍入, 结果是 2018-12-01, 也就是包含整个12月.


③ "lt": "2018-12-18||/M" ?? 小于日期, 需要向上舍入, 结果是2018-12-01, 也就是不包含整个12月.


④ "lte": "2018-12-18||/M" ?? 小于或等于日期, 需要向下舍入, 结果是2018-12-31T23:59:59.999, 也就是包含整个12月.


4 日期格式化范围查询(format)


格式化日期查询时, 将默认使用日期field中指定的格式进行解析, 当然也可以通过format参数来覆盖默认配置.


示例:


GET website/_search


{


"query": {


"range": {


"post_date": {


"gte": "2/1/2018",


"lte": "2019",


"format": "dd/MM/yyyy||yyyy"


}


}


}


}


注意: 如果日期中缺失了部分年、月、日, 缺失的部分将被填充为unix系统的初始值, 也就是1970年1月1日.


比如, 将dd指定为format, 像"gte": 10将转换为1970-01-10T00:00:00.000Z.


5 时区范围查询(time_zone)


如果日期field的格式允许, 也可以通过在日期值本身中指定时区, 从而将日期从另一个时区的时间转换为UTC时间, 或者为其指定特定的time_zone参数.


示例:


GET website/_search


{


"query": {


"range": {


"post_date": {


"gte": "2018-01-01 00:00:00",


"lte": "now",


"format": "yyyy-MM-dd hh:mm:ss",


"time_zone": "+1:00"


}


}


}


}


ES中的日期类型必须按照UTC时间格式存储, 所以, 上述的2018-01-01 00:00:00将被转换为2017-12-31T23:00:00 UTC.


另外需要注意的是, now是不受time_zone影响的.


热文推荐
猜你喜欢
友情链接: