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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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。


PUT my_index

{

 "mappings": {

   "_doc": {

     "properties": {

       "date": {

         "type":   "date",

         "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

       }

     }

   }

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

步骤3:常见日期类型的检索方式:

range时间区间检索:


GET _search

{

   "query": {

       "range" : {

           "timestamp" : {

               "gte": "2015-01-01 00:00:00",

               "lte": "now",

               "time_zone": "+01:00"

           }

       }

   }

}

1

2

3

4

5

6

7

8

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中的脚步语言。

应用举例:


GET /_search

{

   "query": {

       "bool" : {

           "must" : {

               "script" : {

                   "script" : {

                       "source": "doc['num1'].value > 1",

                       "lang": "painless"

                    }

               }

           }

       }

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

2、时间的返回接口

getDate().getMonthOfYear()


注意:

date.getMonthOfYear() == 11 返回11月;

date.getDayOfMonth() == 11 返回11日。


5、如何实现呢?

基于之前的分析,我的思路:

第一步:获取月;

第二步:获取日;

第三步:二者与。


具体实现:


POST index_*/_search

{

 "size":100,

 "_source": {

 "includes": [

 "title",

 "create_time"

 ]

 },

 "query": {

 "bool" : {

 "must" : [{

 "script" : {

 "script" : {

 "inline": "doc['create_time'].getDate().getMonthOfYear() == 12",

 "lang": "painless"


 }

 }

 },

 {

 "script" : {

 "script" : {

 "inline": "doc['create_time'].getDate().getDayOfMonth() == 23",

 "lang": "painless"


 }

 }

 }

 ]

 }

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

返回结果:

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


{

 "took": 5,

 "timed_out": false,

 "_shards": {

 "total": 5,

 "successful": 5,

 "failed": 0

 },

 "hits": {

 "total": 8536,

 "max_score": 1,

 "hits": [

 {

 "_index": "bak_index_v3",

 "_type": "bke_type",

 "_id": "AWCEDIuUYGOEa9MAzRvk",

 "_score": 1,

 "_source": {

 "create_time": "2017-12-23 23:45:02",

 "title": "世界道学网-道学文摘-唱道真言"

 }

 },

 {

 "_index": "bak_index_v3",

 "_type": "bke_type",

 "_id": "AWCD2bs4YGOEa9MAzRta",

 "_score": 1,

 "_source": {

 "create_time": "2017-12-23 22:49:32",

 "title": "新浪网-航天知识-飞向月球"

 }

 },

 {

 "_index": "bak_index_v3",

 "_type": "baike_type",

 "_id": "AWB_uk1jYGOEa9MAzRs4",

 "_score": 1,

 "_source": {

 "create_time": "2017-12-23 03:36:44",

 "title": "3DXXX需求"

 }

 },

 {

 "_index": "bak_index_v3",

 "_type": "bke_type",

 "_id": "AWCD2bhbYGOEa9MAzRtZ",

 "_score": 1,

 "_source": {

 "create_time": "2017-12-23 22:49:31",

 "title": "新浪网-知识-什么是全球定位系统"

 }

 }

 ]

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

6、小结

对于不熟悉的业务场景,可以通过检索英文关键词,通过Google、stackoverflow等最快找到解决方案。此处,切记:不要盲目用中文检索。

使用完以后,一定要形成知识点总结,便于以后的触类旁通。

参考:脚本检索——


http://t.cn/R3nxhwW


7、这就完了吗?

有没有更便捷的方法。

这里,后期检索的时候,发现如下不需要bool检索的更高效的解决方案:

https://goo.gl/EhtJA2


核心的一行脚本:

“script”: “doc.ActivityDate.date.getMonthOfYear() == 12 && doc.ActivityDate.date.getDayOfMonth() == 9”

对应于我们的问题的解决方案:


doc['create_time'].getDate().getMonthOfYear() == 11

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

1

2

同时,这里告诉我们正确的英文关键词的搜索应该为:

Elasticsearch Filtering part of date ignoring Year like SQL DATEPART function

你我共深思。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
5月前
|
存储 人工智能 自然语言处理
阿里云Elasticsearch AI场景语义搜索最佳实践
本文介绍了如何使用阿里云Elasticsearch结合搜索开发工作台搭建AI语义搜索。
17321 68
|
4月前
|
运维 监控 数据可视化
Elasticsearch全观测技术解析问题之面对客户不同的场景化如何解决
Elasticsearch全观测技术解析问题之面对客户不同的场景化如何解决
|
5月前
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
218 12
|
5月前
|
运维 监控 Java
在大数据场景下,Elasticsearch作为分布式搜索与分析引擎,因其扩展性和易用性成为全文检索首选。
【7月更文挑战第1天】在大数据场景下,Elasticsearch作为分布式搜索与分析引擎,因其扩展性和易用性成为全文检索首选。本文讲解如何在Java中集成Elasticsearch,包括安装配置、使用RestHighLevelClient连接、创建索引和文档操作,以及全文检索查询。此外,还涉及高级查询、性能优化和故障排查,帮助开发者高效处理非结构化数据。
79 0
|
6月前
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
|
6月前
|
存储 索引
Elasticsearch索引之嵌套类型:深度剖析与实战应用
Elasticsearch索引之嵌套类型:深度剖析与实战应用
|
7月前
|
人工智能 自然语言处理 开发者
Langchain 与 Elasticsearch:创新数据检索的融合实战
Langchain 与 Elasticsearch:创新数据检索的融合实战
223 10
|
6月前
|
存储 JSON 搜索推荐
Springboot2.x整合ElasticSearch7.x实战(三)
Springboot2.x整合ElasticSearch7.x实战(三)
56 0
|
6月前
|
存储 自然语言处理 关系型数据库
Springboot2.x整合ElasticSearch7.x实战(二)
Springboot2.x整合ElasticSearch7.x实战(二)
54 0
|
6月前
|
搜索推荐 数据可视化 Java
Springboot2.x整合ElasticSearch7.x实战(一)
Springboot2.x整合ElasticSearch7.x实战(一)
56 0