专栏首页铭毅天下实战 | 一步步排查基于业务场景的Elasticsearch难题!

实战 | 一步步排查基于业务场景的Elasticsearch难题!

1、题记

我们在实际的业务场景中做Elasticsearch开发时,免不了遇到这样、那样的问题。 《死磕Elasticsearch方法论》中,已经告诉大家相关问题的排查方法。 这一节,我们以具体的示例,解决基于业务场景的Elasticsearch难题的方法?

2、上问题

请问下es可以在date字段上查询月日吗 下单时间字段类型是date,想查询每年11月11日下单的记录?有什么办法可以zh直接查? 原文链接:https://elasticsearch.cn/question/3649

3、搜索已有知识储备

步骤1:脑海中显现:ES中有哪些数据类型?ES支持哪些数据类型。 此处,我个人认为,没必要记住。 但是,要知道,从哪里查? 记住,查询方法如下: 在Google或者Bing国际版输入:“elasticsearch data type” 相关链接:http://t.cn/REjyfxa

步骤2:ES中date字段时如何定义的? 在核心的数据类型部分,就介绍了ES中的Date类型: 数据类型分为三种: 1)字符串类型如: "2015-01-01" or "2015/01/01 12:10:30". 2)长整型,以毫秒度量:1520256456000 3)整型,以秒度量:1520256456。

 1PUT my_index
 2{
 3  "mappings": {
 4    "_doc": {
 5      "properties": {
 6        "date": {
 7          "type":   "date",
 8          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
 9        }
10      }
11    }
12  }
13}

步骤3:常见日期类型的检索方式: range时间区间检索:

 1GET _search
 2{
 3    "query": {
 4        "range" : {
 5            "timestamp" : {
 6                "gte": "2015-01-01 00:00:00", 
 7                "lte": "now", 
 8                "time_zone": "+01:00"
 9            }
10        }
11    }
12}

参考: http://t.cn/RcWM2Py

步骤4:如何获取日期中指定的年、月、日检索? 能想到的是什么呢——的确,我也没这么用过。 注意:此时一定要用英文去检索。 在Google或者Bing国际版或者Stackoverflow中输入:“elasticsearch date get month“。

看看网友的思路: 返回如下: http://t.cn/REjVkGW http://t.cn/REjfh8z

初步,确定解决方案。 结合:script检索+ getDate().getMonthOfYear()接口实现条件检索。

4、敲黑板——知识点

1、script检索 一种基于 Painless脚本语言的检索, Painless 脚本语言是简单、安全应用于Elasticsearch中的脚步语言。 应用举例:

 1GET /_search
 2{
 3    "query": {
 4        "bool" : {
 5            "must" : {
 6                "script" : {
 7                    "script" : {
 8                        "source": "doc['num1'].value > 1",
 9                        "lang": "painless"
10                     }
11                }
12            }
13        }
14    }
15}

2、时间的返回接口 getDate().getMonthOfYear()

注意: date.getMonthOfYear() == 11 返回11月; date.getDayOfMonth() == 11 返回11日。

5、如何实现呢?

基于之前的分析,我的思路: 第一步:获取月; 第二步:获取日; 第三步:二者与。

具体实现:

 1POST index_*/_search
 2{
 3  "size":100,
 4  "_source": {
 5  "includes": [
 6  "title",
 7  "create_time"
 8  ]
 9  },
10  "query": {
11  "bool" : {
12  "must" : [{
13  "script" : {
14  "script" : {
15  "inline": "doc['create_time'].getDate().getMonthOfYear() == 12",
16  "lang": "painless"
17  }
18  }
19  },
20  {
21  "script" : {
22  "script" : {
23  "inline": "doc['create_time'].getDate().getDayOfMonth() == 23",
24  "lang": "painless"
25  }
26  }
27  }
28  ]
29  }
30  }
31}

返回结果: 实际业务中,我以12月,23日作为检索条件验证的,我用的系统中没有11月11日的数据。

 1{
 2  "took": 5,
 3  "timed_out": false,
 4  "_shards": {
 5  "total": 5,
 6  "successful": 5,
 7  "failed": 0
 8  },
 9  "hits": {
10  "total": 8536,
11  "max_score": 1,
12  "hits": [
13  {
14  "_index": "bak_index_v3",
15  "_type": "bke_type",
16  "_id": "AWCEDIuUYGOEa9MAzRvk",
17  "_score": 1,
18  "_source": {
19  "create_time": "2017-12-23 23:45:02",
20  "title": "世界道学网-道学文摘-唱道真言"
21  }
22  },
23  {
24  "_index": "bak_index_v3",
25  "_type": "bke_type",
26  "_id": "AWCD2bs4YGOEa9MAzRta",
27  "_score": 1,
28  "_source": {
29  "create_time": "2017-12-23 22:49:32",
30  "title": "新浪网-航天知识-飞向月球"
31  }
32  },
33  {
34  "_index": "bak_index_v3",
35  "_type": "baike_type",
36  "_id": "AWB_uk1jYGOEa9MAzRs4",
37  "_score": 1,
38  "_source": {
39  "create_time": "2017-12-23 03:36:44",
40  "title": "3DXXX需求"
41  }
42  },
43  {
44  "_index": "bak_index_v3",
45  "_type": "bke_type",
46  "_id": "AWCD2bhbYGOEa9MAzRtZ",
47  "_score": 1,
48  "_source": {
49  "create_time": "2017-12-23 22:49:31",
50  "title": "新浪网-知识-什么是全球定位系统"
51  }
52  }
53  ]
54  }
55}

6、小结

  1. 对于不熟悉的业务场景,可以通过检索英文关键词,通过Google、stackoverflow等最快找到解决方案。此处,切记:不要盲目用中文检索。
  2. 使用完以后,一定要形成知识点总结,便于以后的触类旁通。

参考:脚本检索——

http://t.cn/R3nxhwW

7、这就完了吗?

有没有更便捷的方法。 这里,后期检索的时候,发现如下不需要bool检索的更高效的解决方案: https://goo.gl/EhtJA2

核心的一行脚本: "script": "doc.ActivityDate.date.getMonthOfYear() == 12 && doc.ActivityDate.date.getDayOfMonth() == 9" 对应于我们的问题的解决方案:

1doc['create_time'].getDate().getMonthOfYear() == 11 
2&&  doc['create_time'].getDate(). getDayOfMonth () == 11

同时,这里告诉我们正确的英文关键词的搜索应该为: Elasticsearch Filtering part of date ignoring Year like SQL DATEPART function 你我共深思。

本文分享自微信公众号 - 铭毅天下(gh_0475cf887cf7),作者:铭毅天下

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Elasticsearch全文检索实战小结——复盘我带的第二个项目

    一、项目概述 这是一个被我称之为“没有枪、没有炮,硬着头皮自己造”的项目。项目是和其它公司合作的三个核心模块开发。 使用ES的目的是: 1)、采集数据、网...

    铭毅天下
  • Elasticsearch全文检索实战小结——复盘我带的第二个项目

    一、项目概述 这是一个被我称之为“没有枪、没有炮,硬着头皮自己造”的项目。项目是和其它公司合作的三个核心模块开发。 使用ES的目的是: 1)、采集数据、网站...

    铭毅天下
  • Elasticsearch 高基数聚合性能提升3倍,改动了什么?

    我记得刚入职场,我向导师的导师(辈分应该是:师爷)当面请教一个问题,我说了很长,他实在听不下去了,就说了一句:“你的问题是什么?”,一语惊醒梦中人,我一直记到今...

    铭毅天下
  • 「多图警告」手撕排序算法 - iOS进阶必备

    冒泡排序是通过比较两个相邻元素的大小实现排序,如果前一个元素大于后一个元素,就交换这两个元素。这样就会让每一趟冒泡都能找到最大一个元素并放到最后。

    五分钟学算法
  • go-fastdfs安装以及python调用

    上一篇Centos7下FastDFS从安装到入门中讲述了FastDFS的安装以及概念。

    Devops海洋的渔夫
  • 微信公众号文章防删除

    前段时间《一个出身寒门的状元之死》刷屏了,当我看完了这篇文章,很有感触,一开始我以为是事实,后来才发现完全是虚构,对于我来讲并不是非常在乎文章中的故事是否是真实...

    somenzz
  • 编程小白 | 每日一练(3)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • python实现静态变量

    之所以结果不相同,原因在于第6行赋值的时候,并没有把类变量count变为1,而是f1对象自己生成了一个变量count,并初始化为1。而此时f2.count指向的...

    py3study
  • 火星撞地球,【实现分组】对比Tableau和PowerBI产品设计思路

    本文案例有多重背景,其一便是上海VIP培训活动中,小伙伴当场拿出实际业务来希望实现作图,从开始到超预期的完美实现,共计20分钟。小伙伴可亲自见证在完全精通 Po...

    BI佐罗
  • MySQL之单表查询、多表查询

    having的语法格式与where一致,只不过having是在分组之后进行的过滤,即where虽然不能用聚合函数,但是having可以!

    py3study

扫码关注云+社区

领取腾讯云代金券