大家好喇闸,我是咔咔 不期速成袄琳,日拱一卒
在MySQL中,十分不建議大家給表的默認(rèn)值設(shè)置為Null燃乍,這個(gè)后期咔咔也會(huì)單獨(dú)出一期文章來說明這個(gè)事情唆樊。
但你進(jìn)入一家新公司之前的業(yè)務(wù)中存在大量的字段默認(rèn)值為Null,把這些值導(dǎo)入ElasticSearch中還是需要處理刻蟹,接下來就看看ElasticSearch如何應(yīng)對(duì)空值逗旁。
一、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)幫助吗坚,我是咔咔祈远,下期見。
”