兩個 Elasticsearch 線上實戰(zhàn)問題及解讀
線上實戰(zhàn)問題 1
1、知識點
腳本的使用
2、問題描述:
你好,我想問一下,在 ES 里我想把兩個字段的值是一樣的查出來。
但是其中一個字段是在一個字典里的,我該怎么寫啊?
{
??"query":?{
????"bool":?{
??????"must":?{
????????"script":?{
??????????"script":?{
????????????"source":?"doc['user_id']=?doc['music.sec_uid']",
????????????"lang":?"painless"
??????????}
????????}
??????}
????}
??}
}
比如:我想要查詢 user_id 和 sec_uid 一樣的數(shù)據(jù),但是 sec_uid 是在 music 字典里。
我怎么處理呢?
3、問題分析
需求核心是:比較兩個字段,把不同字段值相同的數(shù)據(jù)取出來。
這個時候,要想到傳統(tǒng)的精準匹配搜索或者全文檢索搜索都不能解決問題。
需要更高階的搜索才可以,此時腦子里要快速過文檔,當然也可以與查看文檔相結合。
逐步定位文檔的位置:

研讀官方給出的 Demo,基本就能得到問題的答案。
這里會引申出一個非常重要的知識點,也是實戰(zhàn)業(yè)務場景反饋最多的檢索性能優(yōu)化特別注意的點:
使用腳本可能會降低搜索速度。
正如官方文檔解讀:
腳本無法利用Elasticsearch的倒排索引結構或相關優(yōu)化。有時這可能會導致搜索速度降低。
如果您經(jīng)常使用腳本來轉換索引數(shù)據(jù),則可以通過在攝取期間(數(shù)據(jù)寫入前通過 Ingest 管道方式)進行這些更改來加快搜索速度。但是,這通常意味著較慢的索引速度(數(shù)據(jù)寫入速度)。
4、實戰(zhàn)解答
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"
????????????}
??????????}
????????}
??????]
????}
??}
}
線上實戰(zhàn)問題 2
1、知識點
update_by_query,? ingest 數(shù)據(jù)預處理 + painless 腳本的使用
2、問題描述
update腳本,某個時間字段time,都是 2020-08-10 xx:xx:xx, 如何將該字段所有值替換為2020-10-24 xx:xx:xx, 只改日期,不改時分秒。
咋寫呢?求大佬們指點啊
3、問題分析
需求核心是:
批量更新
腦海里里面映射出:update_by_query
基于特定值的一部分更新
腦海里馬上映射出:painless 腳本處理
腳本實現(xiàn)選型
選型 1:直接 update_by_query 結合 painless
選型 2:update_by_query 結合 inges t結合 painless 腳本處理
我個人傾向于ingest,個人感覺語法相對友好。
逐步定位文檔的位置:

研讀官方給出的Demo,結合拆解的需求,基本就能得到問題的答案。
注意:Ingest 是后來版本的新特性,但到了7.X版本,也已經(jīng)有很長時間了。大家用的少,但的確非常重要,建議要多用、常用常新!
4、實戰(zhàn)解答(非最優(yōu)解)
注意:以下是示例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年國慶更新版)
更短時間更快習得更多干貨!
中國?40%+?Elastic 認證工程師出自于此!
和全球?800+?Elastic 愛好者一起死磕 Elasticsearch!
