Elasticsearch:冷熱數(shù)據(jù)
前言
由于我們公司的訂單數(shù)據(jù)量過大(這對公司是一件好事,畢竟每天都有大量的流水,但對我們技術(shù)人員來講就是一個(gè)挑戰(zhàn)),所以老大提出了關(guān)于訂單的“冷熱數(shù)據(jù)拆分”,把最近3個(gè)月的數(shù)據(jù)依舊放在原來的數(shù)據(jù)源中,但同時(shí)在Elasticsearch中存儲(chǔ)所有的訂單數(shù)據(jù),然后開辟幾個(gè)查詢歷史訂單API,這樣原接口最多只允許訪問三個(gè)月的訂單數(shù)據(jù),而想看到所有數(shù)據(jù)或者需要做統(tǒng)計(jì)的話需要從新開辟的接口里面查。
老大決定技術(shù)方案,而我們下面的小弟就是方案的實(shí)施者;我首先梳理了整個(gè)項(xiàng)目的所有與訂單相關(guān)的功能、API、定時(shí)任務(wù)、消息隊(duì)列、第三方調(diào)用接口,然后進(jìn)行歸類分析,哪些是跨時(shí)間維度的、哪些是分頁查詢等等,最后用思維導(dǎo)圖呈現(xiàn)出來。
存儲(chǔ)訂單數(shù)據(jù)到es
既然已經(jīng)確定了哪些功能需要改動(dòng),正式開工了!首先我先建一個(gè)es的訂單文檔結(jié)構(gòu),然后提供API將訂單數(shù)據(jù)轉(zhuǎn)存到ES里面,訂單文檔結(jié)構(gòu)大致如下所示。
將訂單數(shù)據(jù)轉(zhuǎn)存到es里面的API如下

從es中查詢訂單數(shù)據(jù)
ok,我們現(xiàn)在已經(jīng)把數(shù)據(jù)存儲(chǔ)到es中了,并且在“elasticsearch-head”中也看到了數(shù)據(jù)了,現(xiàn)在我們需要自己寫一個(gè)查詢API,大致如下所示。

ok,查詢API也寫完了,我迫不及待地想要試一下,啟動(dòng)服務(wù),執(zhí)行查詢語句,一看不行,根據(jù)父訂單查不到?why???
問題原因
我通過term查詢不到數(shù)據(jù),但是根據(jù)match可以查到,后來發(fā)現(xiàn)是因?yàn)閜arentId字段類型設(shè)置的問題,因?yàn)樵O(shè)置了該字段類型為text類型,導(dǎo)致es對存儲(chǔ)的數(shù)據(jù)建立了分詞索引,大寫字母都轉(zhuǎn)成小寫了,由于parentId是精確查詢,所以我把類型改為keyword就可以了。

在這里我們不得不延伸聊一下term查詢了。
term查詢
常用的 term 查詢,它可以用來處理數(shù)字(numbers)、布爾值(Booleans)、日期(dates)以及文本(text)。term查詢數(shù)字的時(shí)候并沒有什么問題,但是當(dāng)我們對字符串類型的字段進(jìn)行term查詢時(shí)可能會(huì)得到意想不到的情況,可能明明有記錄卻查詢不到,也可能查詢出不符合預(yù)期的記錄(就像你跟女朋友談戀愛剛開始的時(shí)候,明明你已經(jīng)主動(dòng)了太多了,但女方還是沒有反應(yīng),講道理,做男人太難了)。
測試字段的分詞情況

keyword和text的區(qū)別
keyword:存儲(chǔ)數(shù)據(jù)時(shí)候,不會(huì)分詞建立索引
text:存儲(chǔ)數(shù)據(jù)時(shí)候,會(huì)自動(dòng)分詞,生成索引,并且全部小寫
解決方案
把text改為keyword
將index屬性設(shè)置成 not_analyzed 無需分析
寫在最后
好兄弟可以點(diǎn)贊并關(guān)注我的公眾號“javaAnswer”,全部都是干貨。
