速看,ElasticSearch如何處理空值

大家好喇闸,我是咔咔 不期速成袄琳,日拱一卒

在MySQL中,十分不建議大家給表的默認(rèn)值設(shè)置為Null燃乍,這個(gè)后期咔咔也會(huì)單獨(dú)出一期文章來說明這個(gè)事情唆樊。

但你進(jìn)入一家新公司之前的業(yè)務(wù)中存在大量的字段默認(rèn)值為Null,把這些值導(dǎo)入ElasticSearch中還是需要處理刻蟹,接下來就看看ElasticSearch如何應(yīng)對(duì)空值逗旁。

3a8e2fbd8e234773a38eb7fc36386eb3.png

一、ElasticSearch如何處理Null值的

先看一個(gè)案例舆瘪,當(dāng)值為null時(shí)會(huì)發(fā)生什么

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">POST /kaka/_bulk { "index": { "_id": "1"}} { "tags" : ["search"]} { "index": { "_id": "2"}} { "tags" : ["search", "open_source"] } { "index": { "_id": "3"}} { "tags" : null } { "index": { "_id": "4"}} { "tags" :"null"} </pre>

在這個(gè)案例中可以發(fā)現(xiàn)片效,第3、4都存在一個(gè)null值英古,不同的是一個(gè)為字符串null

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">post /kaka/_search { "query":{ "term": { "tags": null } }, "profile":"true" } </pre>

當(dāng)你執(zhí)行上面這搜索時(shí)會(huì)出現(xiàn)下面這個(gè)錯(cuò)誤

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "field name is null or empty" } ], "type": "illegal_argument_exception", "reason": "field name is null or empty" }, "status": 400 } </pre>

然后咔咔就跑到ElasticSearch文檔找了一下原因堤舒,是因?yàn)樵贓lasticSearch中空值不能被索引或搜索,當(dāng)字段值為null時(shí)哺呜、空數(shù)組舌缤、null值數(shù)組時(shí),會(huì)將其視為該字段沒有值

若你執(zhí)行的語句為如下某残,則會(huì)返回最后一條數(shù)據(jù)

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">post /kaka/_search { "query":{ "term": { "tags": "null" } }, "profile":"true" } </pre>

二国撵、使用exists解決ElasticSearch中Null值搜索問題

同樣在文檔中咔咔也找到了答案,案例如下

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">post /kaka/_search { "query":{ "constant_score": { "filter": { "missing": { "field": "tags" } } } } } </pre>

執(zhí)行結(jié)果返回no [query] registered for [missing]玻墅,這就讓人有點(diǎn)百思不得其解介牙,再通過啃文檔后發(fā)現(xiàn)這個(gè)接口在ElasticSearch7.1已經(jīng)被取消了,根據(jù)文檔的意思是exists可以同時(shí)滿足存在和不存在兩種情況

先看使用exists如何查詢不為null

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">post /kaka/_search { "query":{ "constant_score":{ "filter":{ "exists":{ "field":"tags" } } } } } </pre>

再看使用exists查詢?yōu)閚ull的

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">post /kaka/_search { "query":{ "bool":{ "must_not":{ "exists":{ "field":"tags" } } } } } </pre>

三澳厢、使用null_value替換顯示的空值

刪除上邊定義的索引delete kaka环础,然后自定義mapping囚似,給tags設(shè)置"null_value" : "null",用指定的值替換顯示的空值线得,"null"可以自定義為任意值

使用了null_value這樣做的好處就是空字段也可以被索引饶唤,同時(shí)也不會(huì)在查詢時(shí)報(bào)field name is null or empty的錯(cuò)誤

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">put kaka { "mappings":{ "properties":{ "tags" :{ "type":"keyword", "null_value":"null" } } } } </pre>

再插入上邊的數(shù)據(jù)

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">POST /kaka/_bulk { "index": { "_id": "1"}} { "tags" : ["search"]} { "index": { "_id": "2"}} { "tags" : ["search", "open_source"] } { "index": { "_id": "3"}} { "tags" : null } { "index": { "_id": "4"}} { "tags" :"null"} </pre>

再次執(zhí)行查詢?yōu)閚ull的數(shù)據(jù),就會(huì)出現(xiàn)第3贯钩、4條數(shù)據(jù)

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">post /kaka/_search { "query":{ "term": { "tags": "null" } }, "profile":"true" } </pre>

四募狂、使用null_value注意點(diǎn)

null_value必須和定義的數(shù)據(jù)類型匹配,例如long類型的不能定義字符串類型的value_null值

看一下long類型設(shè)置了字符串類型value_null會(huì)出現(xiàn)什么錯(cuò)誤

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"># 錯(cuò)誤演示角雷,long類型使用了字符串類型的null_value值 put kaka { "mappings":{ "properties":{ "tags" :{ "type":"long", "null_value":"null" } } } } </pre>

返回錯(cuò)誤如下

<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">{ "error": { "root_cause": [ { "type": "mapper_parsing_exception", "reason": "Failed to parse mapping [_doc]: For input string: \"null\"" } ], "type": "mapper_parsing_exception", "reason": "Failed to parse mapping [_doc]: For input string: \"null\"", "caused_by": { "type": "number_format_exception", "reason": "For input string: \"null\"" } }, "status": 400 } </pre>

注意了數(shù)據(jù)類型外祸穷,你還需要知道value_null不是任何類型都可以使用的,以下列舉的類型都可使用null_value

  • Array
  • Boolean
  • Date
  • geo_point
  • ip
  • keyword
  • Numeric
  • point

堅(jiān)持學(xué)習(xí)勺三、堅(jiān)持寫作雷滚、堅(jiān)持分享是咔咔從業(yè)以來所秉持的信念。愿文章在偌大的互聯(lián)網(wǎng)上能給你帶來一點(diǎn)幫助吗坚,我是咔咔祈远,下期見。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刻蚯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桑嘶,更是在濱河造成了極大的恐慌炊汹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逃顶,死亡現(xiàn)場(chǎng)離奇詭異讨便,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)以政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門霸褒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盈蛮,你說我怎么就攤上這事废菱。” “怎么了抖誉?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵殊轴,是天一觀的道長。 經(jīng)常有香客問我袒炉,道長旁理,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任我磁,我火速辦了婚禮孽文,結(jié)果婚禮上驻襟,老公的妹妹穿的比我還像新娘。我一直安慰自己芋哭,他們只是感情好沉衣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楷掉,像睡著了一般厢蒜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烹植,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天斑鸦,我揣著相機(jī)與錄音,去河邊找鬼草雕。 笑死巷屿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墩虹。 我是一名探鬼主播嘱巾,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼诫钓!你這毒婦竟也來了旬昭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤菌湃,失蹤者是張志新(化名)和其女友劉穎问拘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惧所,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骤坐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了下愈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纽绍。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖势似,靈堂內(nèi)的尸體忽然破棺而出拌夏,到底是詐尸還是另有隱情,我是刑警寧澤履因,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布辖佣,位于F島的核電站,受9級(jí)特大地震影響搓逾,放射性物質(zhì)發(fā)生泄漏卷谈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一霞篡、第九天 我趴在偏房一處隱蔽的房頂上張望世蔗。 院中可真熱鬧端逼,春花似錦、人聲如沸污淋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寸爆。三九已至礁鲁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赁豆,已是汗流浹背仅醇。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魔种,地道東北人析二。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像节预,于是被迫代替她去往敵國和親叶摄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容