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

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 我们在实际的业务场景中做Elasticsearch开发时,免不了遇到这样、那样的问题。《死磕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。

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

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

GET _search
{
    "query": {
        "range" : {
            "timestamp" : {
                "gte": "2015-01-01 00:00:00", 
                "lte": "now", 
                "time_zone": "+01:00"
            }
        }
    }
}

参考:
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"
                     }
                }
            }
        }
    }
}

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"

  }
  }
  }
  ]
  }
  }
}

返回结果:
实际业务中,我以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": "新浪网-知识-什么是全球定位系统"
  }
  }
  ]
  }
}

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”
对应于我们的问题的解决方案:

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

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

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
11月前
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
704 6
|
5月前
|
人工智能 自然语言处理 运维
让搜索引擎“更懂你”:AI × Elasticsearch MCP Server 开源实战
本文介绍基于Model Context Protocol (MCP)标准的Elasticsearch MCP Server,它为AI助手(如Claude、Cursor等)提供与Elasticsearch数据源交互的能力。文章涵盖MCP概念、Elasticsearch MCP Server的功能特性及实际应用场景,例如数据探索、开发辅助。通过自然语言处理,用户无需掌握复杂查询语法即可操作Elasticsearch,显著降低使用门槛并提升效率。项目开源地址:<https://github.com/awesimon/elasticsearch-mcp>,欢迎体验与反馈。
1467 1
|
8月前
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
365 3
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
存储 人工智能 自然语言处理
阿里云Elasticsearch AI场景语义搜索最佳实践
本文介绍了如何使用阿里云Elasticsearch结合搜索开发工作台搭建AI语义搜索。
17712 68
|
运维 监控 数据可视化
Elasticsearch全观测技术解析问题之面对客户不同的场景化如何解决
Elasticsearch全观测技术解析问题之面对客户不同的场景化如何解决
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
550 12
|
运维 监控 Java
在大数据场景下,Elasticsearch作为分布式搜索与分析引擎,因其扩展性和易用性成为全文检索首选。
【7月更文挑战第1天】在大数据场景下,Elasticsearch作为分布式搜索与分析引擎,因其扩展性和易用性成为全文检索首选。本文讲解如何在Java中集成Elasticsearch,包括安装配置、使用RestHighLevelClient连接、创建索引和文档操作,以及全文检索查询。此外,还涉及高级查询、性能优化和故障排查,帮助开发者高效处理非结构化数据。
192 0
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
227 0
|
存储 索引
Elasticsearch索引之嵌套类型:深度剖析与实战应用
Elasticsearch索引之嵌套类型:深度剖析与实战应用
|
存储 JSON 搜索推荐
Springboot2.x整合ElasticSearch7.x实战(三)
Springboot2.x整合ElasticSearch7.x实战(三)
147 0