一種Elasticsearch資料型別冗餘方案

2021-06-23 02:24:40 字數 1393 閱讀 9630

在網際網路環境中,我們從不指望使用者都是規矩的玩家。

在我們的elasticsearch應用場景中,使用者向我們傳送各種各樣的json資料,而elasticsearch會在某個json欄位第一次來之後,判斷其值的型別,並以此型別作為後續的相同欄位的型別。可是不合規矩的資料總是會來:

第一次傳送的資料: }

第二次傳送的資料:}

第一條資料發來之後,elasticsearch會將context.price欄位設定成long的數字型別,但是當第二條資料過來之後,elasticsearch嘗試將kitty轉換成數字型別時出錯了,換句話說本條資料丟了,這對於挑剔(不規矩,也有可能是不小心)的使用者來說是不能接受的。為此,我們必須提供一種資料型別冗餘的機制,而此機制並不複雜。

為了實現此資料型別冗餘機制,我們需要做兩件事情:

1. 對每個值進行資料型別推斷

2. 將推斷出來的型別與資料一併寫入到elasticsearch中

這裡需要注意的是,型別的推斷應該從具體到抽象,也就是說我們應該先判斷乙個值是不是能夠轉換成數字,而後再判斷乙個值是不是能夠轉換成字串,這是顯而易見的,因為發過來的資料都是字串。

原始資料: }...

轉換之後:}, }}

原始資料: }...

轉換之後:}, }}

其中:l代表long,s代表string。dbl可以用來代表double, b可以用來代表bool等。

通過以上的方案,我們就完成了對資料型別資訊的冗餘。這樣我們就可以以使用者需要的操作來選擇不同的資料型別:如果使用者需要算price平均值,我們要做的僅僅是對context.price.dbl進行操作;而如果使用者要做是檢視price的分布,我們就可以分別對這個欄位上所有型別的:context.price.s, context.price.dbl等一同進行操作即可。

字串在預設情況下,儲存時會被analyze(預設是標準分析器),這個過程會將字串進行分詞動作,這對於資料分析需求來說是不必須要的,對於效能來說也是有損耗的,為此,我們需要將對應索引中的所有的字串值設定成not_analyzed,這可以通過動態模板來完成:

需要注意幾點:

1. 我們匹配了所有名字符合test*模式的索引,只對這些索引應用這個模板

2. 我們將字串型別的值都設定成了not_analyzed

3. 由於不需要全文搜尋,_all欄位也是被禁用的,這對效能提公升也有一定幫助

以上,希望對遇到類似問題的同學能有幫助。

每一種創傷,都是一種成熟

6.如果你準備結婚的話,告訴你一句非常重要的哲學名言 你一定要忍耐包容對方的缺點,世界上沒有絕對幸福圓滿的婚姻,幸福只是來自於無限的容忍與互相尊重。7.我的財富並不是因為我擁有很多,而是我要求的很少。8.不是某人使我煩惱,而是我拿某人的言行來煩惱自己。9.活在別人的掌聲中,是禁不起考驗的人。10.如...

每一種創傷,都是一種成熟

1.活著一天,就是有福氣,url 就該珍惜 url 當我哭泣我沒有鞋子穿的時候,我發現有人卻沒有腳。2.寧可自己去原諒別人,莫讓別人來原諒你。3.世界原本就不是屬於你,因此你用不著拋棄,要拋棄的是一切的執著。萬物皆為我所用,但非我所屬。4.別人可以違背因果,別人可以害我們,打我們,毀謗我們。可是我們...

快樂是一種品位,一種氣質。

這兩天很不爽,2月初,應該是寒冷的,可是杭州現在最高溫度達到了24度,確切的說今天的氣溫是13 24度,大太陽。暖和了,卻惶恐了。如果沒了季節之分,冬不冬,春不春,夏不夏,秋不秋,將多麼可怕。開啟qq氣象台,發現北方很冷,就杭州一帶很古怪。突然羨慕北方的人,享受著冬天。我覺得我都該裸奔了,熱啊!去年...