ES 22 - Elasticsearch中如何进行日期(数值)范围查询

目录

  • 1 范围查询的符号
  • 2 数值范围查询
  • 3 时间范围查询
    • 3.1 简单查询示例
    • 3.2 关于时间的数学表达式(date-math)
    • 3.3 关于时间的四舍五入
  • 4 日期格式化范围查询(format)
  • 5 时区范围查询(time_zone)

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影响的.

参考资料

Elasticsearch官方文档 - Range Query

版权声明

作者: 马瘦风(https://healchow.com)

出处: 博客园 马瘦风的博客(https://www.cnblogs.com/shoufeng)

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶??] 或 [推荐??] 吧??

本文版权归博主所有, 欢迎转载, 但 [必须在文章页面明显位置标明原文链接], 否则博主保留追究相关人员法律责任的权利.

原文地址:https://www.cnblogs.com/shoufeng/p/11266136.html

时间: 2024-10-12 01:22:23

ES 22 - Elasticsearch中如何进行日期(数值)范围查询的相关文章

elasticsearch中的mapping映射配置与查询典型案例

elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题"."内容"."作者"."类型"."发布时间"这五个字段:我们要提供"标题和内容的检索"."排序"."高亮"."统计"."过滤"等一些基本功能.ES提供了smartcn的中文分词插件,测试的话建议使用IK分

Elasticsearch+Mongo亿级别数据导入及查询实践

数据方案: 在Elasticsearch中通过code及time字段查询对应doc的mongo_id字段获得mongodb中的主键_id 通过获得id再进入mongodb进行查询   1,数据情况: 全部为股票及指数的分钟K线数据(股票代码区分度较高) Elasticsearch及mongodb都未分片且未优化参数配置 mongodb数据量: Elasticsearch数据量: 2,将数据从mongo源库导入Elasticsearch import time from pymongo impor

sql语句中日期时间格式化查询

      今天在做会员管理系统搜索时,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式"2007-5-22 14:32:12"当我们在查询2007-5-22是否与它相等,结果是不相等的.      所我们都喜欢找其它途径来解决这个问题.但是我发现我们的方法都不是太好,因为我们有的时候对sql sever的语句特性还了解的不够彻底.所以我查询了查sql server有帮助,终于发现个好东西,可以解决这个问题. CONVE

Elasticsearch中的CRUD

在<玩玩儿Elasticsearch>中简介了一下elasticsearch.这篇文章.我们还是做些基础的学习.在Elasticsearch怎样进行CRUD? 如果我们正在创建的一个类似微博的应用.我们就姑且先叫它"kiwi"吧.kiwi这个应用就是一条条消息组成的. 在kiwi中,消息称为ksay.有两个部分组成.一是作者(author),而是消息本身(message). Create curl -X POST http://localhost:9200/kiwi/ksa

ElasticSearch中的一些概念

索引词(term) 在elasticsearch中索引词(term)是一个能够被索引的精确值.foo,Foo Foo几个单词是不相同的索引词.索引词(term)是可以通过term查询进行准确的搜索. 文本(text) 文本是一段普通的非结构化文字,通常,文本会被分析称一个个的索引词,存储在elasticsearch的索引库中,为了让文本能够进行搜索,文本字段需要事先进行分析:当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本. 分析(analysis) 分析是将文本转换为索引

统计elasticsearch中月每天索引量的脚本

随着业务量的不断上升,最近一段时间需要对生产环境中的elasticsearch集群中的历史索引数据做迁移,而在做迁移前需要对被迁移的elasticsearch索引数据做统计用于迁移后的验证统计,所以就写了一个脚本用于es数据中查询历史索引的量生成报表文件,而在其中有使用过jq工具用于取数,jq的介绍可以查看http://jim123.blog.51cto.com/4763600/1966964: #!/bin/bash #es_count_report.sh #used for elastics

ElasticSearch 中 _source 字段

有很多人会有这样的一个疑问: _source字段存储的是索引的原始内容,那 store 属性的设置是为何呢?elasticsearch 为什么要把 store 的默认取值设置为 no?设置为 yes 是否是重复的存储呢? 我们将一个 field 的值写入 elasticsearch 中,是想在这个 field 上执行 search 操作.但是,如果不显式的将该 field 的 store 属性设置为yes,同时 _source 字段 enabled 的情况下,你仍然可以获取到这个 field 的

在Elasticsearch中实现统计异常检测器——第一部分

Implementing a Statistical Anomaly Detector in Elasticsearch - Part 1 该图显示了4500万个数据点的最小/最大/平均值(超过600小时的75,000个单独时间序列).这个图表中有八个大型的模拟中断,你能发现吗? 没有? 没关系,我也不行.当你将所有数据汇总到一个图表中时,你所有的数据变化往往可以平滑表示,除了最明显的变化.相比之下,这是从组成第一个图形的75,000系列中随机选择的: 这些单独的图表明确的显示可能发生中断的地方

mysql 中 时间和日期函数

原文链接: mysql 中 时间和日期函数 - redfox - 博客园 http://www.cnblogs.com/redfox241/archive/2009/07/23/1529092.html ----------------------------------------------------------------------------------------------------------------------------------------------------