<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Elasticsearch 線上問題實(shí)戰(zhàn)——如何借助 painless 更新時(shí)間?

          共 3705字,需瀏覽 8分鐘

           ·

          2021-10-13 16:23

          1、線上問題

          昨晚 11:14 收到球友周大哥的問題:

          老大,請(qǐng)教個(gè)問題。你用painless操作過@timestamp字段嗎?比如我獲取了當(dāng)前timestamp后,想要減去5分鐘, 這個(gè)怎么寫?ctx._source['@timestamp'] 是get當(dāng)前的timestamp,后面operator要怎么寫?

          2、問題拆解

          第一:晚上 11:14發(fā)出問題,說明問題很著急,極大可能是線上問題。
          第二:球友周大哥是資深架構(gòu)師,可能問題會(huì)有一點(diǎn)彎或是有一些不常用的細(xì)節(jié)。
          第三:看問題。
          一句話概括問題:對(duì)于給定的時(shí)間字段值,用 painless 腳本實(shí)現(xiàn)減去 5 分鐘的處理。
          painless 腳本的處理,我想到的是:ingest 預(yù)處理管道的使用。
          當(dāng)然之前我們也講過還有直接處理腳本的方式,但是:結(jié)合管道預(yù)處理會(huì)更方便、更好理解。

          3、開搞,實(shí)戰(zhàn)一把

          3.1 步驟 1:創(chuàng)建索引,并導(dǎo)入一批含日期類型的數(shù)據(jù)。

          DELETE?logs
          PUT?logs
          {
          ??"mappings":?{
          ????"properties":?{
          ??????"name":?{
          ????????"type":?"text"
          ??????},
          ??????"start_date":?{
          ????????"type":?"date"
          ??????},
          ??????"close_date":?{
          ????????"type":?"date"
          ??????}
          ????}
          ??}
          }

          PUT?logs/_bulk?refresh
          {"index":{"_id":1}}
          {"name":"Person?AA","start_date":"2015-05-06T02:49:40.894Z","close_date":"2015-11-01T18:10:30Z"}
          {"index":{"_id":2}}
          {"name":"Person?CC","start_date":"2015-05-06T02:49:40.894Z","close_date":"2015-11-02T13:10:30Z"}

          3.2 步驟 2:更新處理嘗試。

          我的初始理解,獲取時(shí)間,然后 - 5(代表 5 分鐘的意思),不就搞定了嗎。

          試試看?simulate 仿真執(zhí)行一下:

          POST?/_ingest/pipeline/_simulate
          {
          ??"pipeline":?{
          ????"description":?"_description",
          ????"processors":?[
          ??????{
          ????????"script":?{
          ??????????"description":?"add?time",
          ??????????"lang":?"painless",
          ??????????"source":?"""
          ?????????????ctx.start_date?=?ctx.start_date?-?5
          ??????????"""

          ????????}
          ??????}
          ????]
          ??},
          ??"docs":?[
          ????{
          ??????"_index":?"index",
          ??????"_id":?1,
          ??????"_source":?{
          ????????"name":?"Person?AA",
          ????????"start_date":?"2015-05-06T02:49:40.894Z",
          ????????"close_date":?"2015-11-01T18:10:30Z"
          ??????}
          ????}
          ??]
          }
          報(bào)錯(cuò)啦!報(bào)錯(cuò)如下:
          類型錯(cuò)誤。
          是的,一種方案就是繼續(xù):在類型轉(zhuǎn)換上下功夫。搞定類型轉(zhuǎn)換就搞定上面的腳本。
          我做了很多嘗試,效果不大理想??吹竭@里的同學(xué),可以自己嘗試一下,歡迎留言交流。
          這時(shí)候,我想:是不是得轉(zhuǎn)換一下思路。

          3.3 步驟 3:換個(gè)思路,從腳本部分再切入。

          官方文檔的如下部分,引起我的注意:

          換個(gè)思路思考,既然:官方文檔拿出 1 篇文章的篇幅講解 Datetime 時(shí)間類型的 painless 的應(yīng)用,說明這里還是有“文章”的。

          那就翻翻看吧。
          宏觀上看:在 painless “無痛”腳本中,Datetime 時(shí)間類型共有如下三種類型:
          • 類型1:numeric 時(shí)間戳類型,舉例:
          本質(zhì)上,這是一種 long 類型的值。
          • 類型2:string 類型。舉例:"2015-05-06T02:49:40.894Z"。
          我們上面寫入的數(shù)據(jù)就是這種類型。
          • 類型3:complex 類型。這種我們不常見,它是一種復(fù)雜對(duì)象類型。在 painless 中通常為:ZonedDateTime。
          單看 ZonedDateTime 干巴巴的,不知道是啥意思?
          但是,跳轉(zhuǎn)鏈接看到如下內(nèi)容的時(shí)候,頓時(shí)感覺豁然開朗。

          要強(qiáng)調(diào)的是如下一段話,切中選型要害!

          • 在日期時(shí)間格式上述三種不同類型之間切換通常是實(shí)現(xiàn)腳本目標(biāo)所必需的。

          • 腳本中的典型應(yīng)用是:將數(shù)字(numeric)或字符串(string)格式切換為 complex 日期格式,基于complex 日期格式做修改或比較,然后將其切換回?cái)?shù)字或字符串日期格式進(jìn)行存儲(chǔ)或返回結(jié)果。

          繼續(xù)開搞吧:

          PUT?/_ingest/pipeline/time_pipeline
          {
          ??"processors":?[
          ????{
          ??????"script":?{
          ????????"description":?"add?time",
          ????????"lang":?"painless",
          ????????"source":?"""
          ???????????String?datetime?=?ctx.start_date;
          ???????????ZonedDateTime?zdt?=?ZonedDateTime.parse(datetime);
          ???????????zdt?=?zdt.minusMinutes(5);
          ???????????ctx.start_date?=?zdt;
          ??????????"""

          ??????}
          ????}
          ??]
          }

          POST?logs/_update_by_query?pipeline=time_pipeline
          {
          ??"query":?{
          ????"match_all":?{}
          ??}
          }

          GET?logs/_search
          上結(jié)果:

          至此,問題解決完畢。

          4、核心實(shí)現(xiàn)的語法解讀

          第一:獲取時(shí)間字段,賦值為字符串。
          String?datetime?=?ctx.start_date;
          第二:字符串類型轉(zhuǎn) complex 類型。
          ZonedDateTime?zdt?=?ZonedDateTime.parse(datetime);
          第三:執(zhí)行減法操作。
          zdt?=?zdt.minusMinutes(5);
          第四:減法操作后的結(jié)果重新賦值回去。
          ctx.start_date?=?zdt;
          有了 painless 腳本,后面借助:update_by_query 批量更新結(jié)合 painless 腳本就能方便的實(shí)現(xiàn)已有數(shù)據(jù)的更新操作。
          更多 Datetime painless 腳本的使用細(xì)節(jié),推薦參考閱讀文末的官方鏈接地址。

          5、小結(jié)

          第一:對(duì)于不是特別熟悉或者非常小眾的知識(shí)點(diǎn),找到突破口很關(guān)鍵。找到了突破口,就找到了解決問題的思路。
          第二:一個(gè)小的知識(shí)點(diǎn),能引發(fā)很多知識(shí)點(diǎn)甚至知識(shí)鏈條。
          就拿本文舉例:我自己之前肯定也遇到過日期時(shí)間的查詢、聚合、更新處理操作,但是沒有系統(tǒng)化的翻看過 painless 時(shí)間處理的文檔。所以,當(dāng)遇到新的問題的時(shí)候,依然是沒有方法論,只是憑經(jīng)驗(yàn)去猜、嘗試,“猜、嘗試”花的時(shí)間總體算下來比查看官方文檔還要長(zhǎng)。
          “前事不忘后事之師”,今天的實(shí)踐和小結(jié)尤其方法論部分是未來學(xué)習(xí)、實(shí)戰(zhàn)環(huán)節(jié)要改進(jìn)的點(diǎn)。

          參考

          https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-datetime.html
          https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-api-reference-shared-java-time.html#painless-api-reference-shared-ZonedDateTime

          推薦

          1、重磅 | 死磕 Elasticsearch 方法論認(rèn)知清單(2021年國(guó)慶更新版)
          2Elasticsearch 7.X 進(jìn)階實(shí)戰(zhàn)私訓(xùn)課(口碑不錯(cuò))
          3、Elasticsearch 預(yù)處理沒有奇技淫巧,請(qǐng)先用好這一招!
          4、干貨 | Elasticsearch7.X Scripting腳本使用詳解

          短時(shí)間快習(xí)得多干貨!

          已帶領(lǐng)70位球友通過 Elastic 官方認(rèn)證!

          中國(guó)僅通過百余人

          比同事搶先一步學(xué)習(xí)進(jìn)階干貨!
          瀏覽 39
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品无码av一区二区三区不卡 | 一本大道HEYZO乱码专区 一本大道东京热无码中文字幕 | 野花av| 中国一级特黄毛片大片 | 久久久成人日韩大香蕉 |