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

2、問題拆解
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"
??????}
????}
??]
}

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

換個(gè)思路思考,既然:官方文檔拿出 1 篇文章的篇幅講解 Datetime 時(shí)間類型的 painless 的應(yīng)用,說明這里還是有“文章”的。
類型1:numeric 時(shí)間戳類型,舉例: 
類型2:string 類型。舉例:"2015-05-06T02:49:40.894Z"。
類型3:complex 類型。這種我們不常見,它是一種復(fù)雜對(duì)象類型。在 painless 中通常為:ZonedDateTime。

要強(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

4、核心實(shí)現(xiàn)的語法解讀
String?datetime?=?ctx.start_date;
ZonedDateTime?zdt?=?ZonedDateTime.parse(datetime);
zdt?=?zdt.minusMinutes(5);
ctx.start_date?=?zdt;
5、小結(jié)
參考
推薦
更短時(shí)間更快習(xí)得更多干貨!
已帶領(lǐng)70位球友通過 Elastic 官方認(rèn)證!
中國(guó)僅通過百余人

評(píng)論
圖片
表情
