两个 Elasticsearch 线上实战问题及解读

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 线上实战问题 11、知识点脚本的使用2、问题描述:你好,我想问一下,在 ES 里我想把两个字段的值是一样的查出来。但是其中一个字段是在一个字典里的,我该怎么写啊?

{

 "query": {

   "bool": {

     "must": {

       "script": {

         "script": {

           "source": "doc['user_id']= doc['music.sec_uid']",

           "lang": "painless"

         }

       }

     }

   }

 }

}

比如:我想要查询 user_id 和 sec_uid 一样的数据,但是 sec_uid 是在 music 字典里。


我怎么处理呢?


3、问题分析

需求核心是:比较两个字段,把不同字段值相同的数据取出来。


这个时候,要想到传统的精准匹配搜索或者全文检索搜索都不能解决问题。


需要更高阶的搜索才可以,此时脑子里要快速过文档,当然也可以与查看文档相结合。


逐步定位文档的位置:

image.png

研读官方给出的 Demo,基本就能得到问题的答案。


这里会引申出一个非常重要的知识点,也是实战业务场景反馈最多的检索性能优化特别注意的点:


使用脚本可能会降低搜索速度。


正如官方文档解读:


脚本无法利用Elasticsearch的倒排索引结构或相关优化。有时这可能会导致搜索速度降低。


如果您经常使用脚本来转换索引数据,则可以通过在摄取期间(数据写入前通过 Ingest 管道方式)进行这些更改来加快搜索速度。但是,这通常意味着较慢的索引速度(数据写入速度)。


4、实战解答

PUT test_002

{

 "mappings": {

   "properties": {

     "user_id": {

       "type": "keyword"

     },

     "music": {

       "properties": {

         "sec_uid": {

           "type": "keyword"

         }

       }

     }

   }

 }

}

GET test_002/_mapping

POST test_002/_bulk

{"index":{"_id":1}}

{"user_id":333,"music.sec_uid":444}

{"index":{"_id":2}}

{"user_id":333,"music.sec_uid":333}

{"index":{"_id":3}}

{"user_id":333,"music.sec_uid":555}

POST test_002/_search

{

 "query": {

   "bool": {

     "filter": [

       {

         "script": {

           "script": {

             "source":"doc['user_id']==doc['music.sec_uid']",

             "lang":"painless"

           }

         }

       }

     ]

   }

 }

}

线上实战问题 2

1、知识点

update_by_query,  ingest 数据预处理 + painless 脚本的使用


2、问题描述

update脚本,某个时间字段time,都是 2020-08-10 xx:xx:xx, 如何将该字段所有值替换为2020-10-24 xx:xx:xx, 只改日期,不改时分秒。


咋写呢?求大佬们指点啊


3、问题分析

需求核心是:


批量更新


脑海里里面映射出:update_by_query


基于特定值的一部分更新


脑海里马上映射出:painless 脚本处理


脚本实现选型


选型 1:直接 update_by_query 结合 painless


选型 2:update_by_query 结合 inges t结合 painless 脚本处理


我个人倾向于ingest,个人感觉语法相对友好。


逐步定位文档的位置:

image.png

研读官方给出的Demo,结合拆解的需求,基本就能得到问题的答案。


注意:Ingest 是后来版本的新特性,但到了7.X版本,也已经有很长时间了。大家用的少,但的确非常重要,建议要多用、常用常新!


4、实战解答(非最优解)

注意:以下是示例DSL。


PUT my_index

{

 "mappings": {

     "properties": {

       "date": {

         "type": "keyword"

       }

   }

 }

}

PUT my_index/_doc/2

{

 "date": "2015-01-01T12:10:30Z"

}

PUT _ingest/pipeline/my_pipeline

{

 "description": "use index:my-index",

 "processors": [

   {

     "script": {

       "lang": "painless",

       "source": "ctx.data_new = ctx.date.replace('2015-01-01', '2020-01-01')"

     }

   }

 ]

}

POST my_index/_update_by_query?pipeline=my_pipeline

{

 "query":{

   "match_all":{}

 }

}

GET my_index/_search

小结

遇到问题不要慌,


拆解问题来帮忙。


拆解之后找文档,


结合文档和拆解的需求,


问题自然迎刃而解。


通过拆解问题,得到遇到类似问题的应对策略和方法论比什么都重要!


大家对问题又不同见解或者花式解法,欢迎留言交流。


更多推荐:


重磅 | 死磕 Elasticsearch 方法论认知清单(2020年国庆更新版)


能拿驾照就能通过 Elastic 认证考试!

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8月前
elasticsearch使用 scroll 滚动分页实战实例
elasticsearch使用 scroll 滚动分页实战实例
279 0
|
6月前
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
270 12
|
7月前
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
100 0
|
7月前
|
存储 索引
Elasticsearch索引之嵌套类型:深度剖析与实战应用
Elasticsearch索引之嵌套类型:深度剖析与实战应用
|
8月前
|
人工智能 自然语言处理 开发者
Langchain 与 Elasticsearch:创新数据检索的融合实战
Langchain 与 Elasticsearch:创新数据检索的融合实战
260 10
|
8月前
|
消息中间件 Java 关系型数据库
【二十】springboot整合ElasticSearch实战(万字篇)
【二十】springboot整合ElasticSearch实战(万字篇)
1249 47
|
7月前
|
存储 JSON 搜索推荐
Springboot2.x整合ElasticSearch7.x实战(三)
Springboot2.x整合ElasticSearch7.x实战(三)
60 0
|
7月前
|
存储 自然语言处理 关系型数据库
Springboot2.x整合ElasticSearch7.x实战(二)
Springboot2.x整合ElasticSearch7.x实战(二)
59 0
|
7月前
|
搜索推荐 数据可视化 Java
Springboot2.x整合ElasticSearch7.x实战(一)
Springboot2.x整合ElasticSearch7.x实战(一)
64 0
|
8月前
|
存储 缓存 监控
干货 | Elasticsearch 8.X 性能优化实战
干货 | Elasticsearch 8.X 性能优化实战
759 2