首页新闻动态正文

Elasticsearch中如何进行日期(数值)范围查询【黑马大数据培训】

更新时间:2022年12月21日 18时25分27秒 来源:黑马程序员论坛

黑马中级程序员课程

1 范围查询的符号
符号
含义
gtegreater-than or equal to, 大于或等于 gtgreater-than, 大于 lteless-than or equal to, 小于或等于 ltless-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影响的.

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 软件测试培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


分享到:
在线咨询 我要报名
和我们在线交谈!