天天看點

兩個 Elasticsearch 線上實戰問題及解讀

{

 "query": {

   "bool": {

     "must": {

       "script": {

         "script": {

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

           "lang": "painless"

         }

       }

     }

   }

 }

}

比如:我想要查詢 user_id 和 sec_uid 一樣的資料,但是 sec_uid 是在 music 字典裡。

我怎麼處理呢?

3、問題分析

需求核心是:比較兩個字段,把不同字段值相同的資料取出來。

這個時候,要想到傳統的精準比對搜尋或者全文檢索搜尋都不能解決問題。

需要更高階的搜尋才可以,此時腦子裡要快速過文檔,當然也可以與檢視文檔相結合。

逐漸定位文檔的位置:

兩個 Elasticsearch 線上實戰問題及解讀

研讀官方給出的 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

     "filter": [

       {

           "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, 隻改日期,不改時分秒。

咋寫呢?求大佬們指點啊

需求核心是:

批量更新

腦海裡裡面映射出:update_by_query

基于特定值的一部分更新

腦海裡馬上映射出:painless 腳本處理

腳本實作選型

選型 1:直接 update_by_query 結合 painless

選型 2:update_by_query 結合 inges t結合 painless 腳本處理

我個人傾向于ingest,個人感覺文法相對友好。

兩個 Elasticsearch 線上實戰問題及解讀

研讀官方給出的Demo,結合拆解的需求,基本就能得到問題的答案。

注意:Ingest 是後來版本的新特性,但到了7.X版本,也已經有很長時間了。大家用的少,但的确非常重要,建議要多用、常用常新!

4、實戰解答(非最優解)

注意:以下是示例DSL。

PUT my_index

     "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 認證考試!

繼續閱讀