詳解如何在Elasticsearch中搜索空值
引言
根據(jù) Elasticsearch 文檔,無(wú)法索引或搜索空值 null。 當(dāng)一個(gè)字段設(shè)置為 null(或空數(shù)組或空值數(shù)組)時(shí),它被視為該字段沒(méi)有值。
那么如何找到 product_name 為空(null)的文件呢?
選項(xiàng) 1:null_value 映射參數(shù)
你可以在配置索引映射時(shí)定義 null_value 參數(shù)。 它將允許你在索引文檔時(shí)用指定值替換顯式空值 null,以便它可以被索引和搜索。
讓我們創(chuàng)建索引名稱 products,其中包含值為 NULL 的 product_name 字段。
PUT products { "mappings": { "properties": { "product_name":{ "type": "keyword", "null_value": "NULL" } } } }
讓我們用 product_name 字段索引一些文檔,該字段的值為 null 或空數(shù)組。
POST products/_doc/1 { "product_name": null, "company":"apple" } POST products/_doc/2 { "product_name": [], "company":"apple" }
讓我們查詢并檢查我們得到的結(jié)果:
POST products/_search { "query": { "match": { "product_name": "NULL" } } }
上面的搜索結(jié)果為:
` { "took": 1009, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "products", "_id": "1", "_score": 0.2876821, "_source": { "product_name": null, "company": "apple" } } ] } } `
什么??? 為什么 Elasticsearch 只返回一個(gè)文檔而不返回第二個(gè)具有空數(shù)組的文檔? 因?yàn)椋?/p>
- 一個(gè)空數(shù)組不包含明確的 null,因此不會(huì)被 null_value 替換。
此外,product_name 值僅作為 null 而不是作為在索引映射中設(shè)置的 NULL。 因?yàn)椋?/p>
- null_value 只影響數(shù)據(jù)的索引方式,它不會(huì)修改 _source 文檔。
現(xiàn)在,當(dāng) product_name 為 null 或空數(shù)組時(shí),如何將兩個(gè)文檔都放入結(jié)果中?
選項(xiàng)2:使用 MUST_NOT 查詢
讓我們定義沒(méi)有 null_value 的索引映射和與上面相同的索引文檔。
PUT products { "mappings": { "properties": { "product_name":{ "type": "keyword" } } } }
現(xiàn)在你可以使用以下查詢:
POST products/_search { "query": { "bool": { "must_not": [ { "exists": { "field": "product_name" } } ] } } }
上述查詢的結(jié)果,它現(xiàn)在返回兩個(gè)結(jié)果:
` { "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 0, "hits": [ { "_index": "products", "_id": "1", "_score": 0, "_source": { "product_name": null, "company": "apple" } }, { "_index": "products", "_id": "2", "_score": 0, "_source": { "product_name": [], "company": "apple" } } ] } } `
將 must_not 與 exists 查詢一起使用的優(yōu)點(diǎn):
- 此選項(xiàng) 2 不依賴于字段的數(shù)據(jù)類型,無(wú)論字段的數(shù)據(jù)類型如何,它都會(huì)起作用,但選項(xiàng) 1 null_value 需要與字段的數(shù)據(jù)類型相同。 例如,長(zhǎng)字段不能有字符串 null_value。
- 選項(xiàng) 1 不適用于文本類型的字段,因?yàn)?Elasticsearch 不允許為文本類型的字段設(shè)置 null_value 參數(shù)。
- 選項(xiàng) 2 也是單一且高效的解決方案,因?yàn)?1) 它不需要根據(jù)字段映射中定義的值添加 null 值的開(kāi)銷(xiāo)。2)索引大小也會(huì)變小,導(dǎo)致索引變少,搜索查詢變快。
以上就是詳解如何在Elasticsearch中搜索空值的詳細(xì)內(nèi)容,更多關(guān)于Elasticsearch搜索空值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中jieba庫(kù)(中文分詞庫(kù))使用安裝教程
這篇文章主要介紹了python中jieba庫(kù)(中文分詞庫(kù))使用安裝教程,jieba庫(kù)是通過(guò)中文詞庫(kù)的方式來(lái)識(shí)別分詞的。它首先利用一個(gè)中文詞庫(kù),通過(guò)詞庫(kù)計(jì)算漢字之間構(gòu)成詞語(yǔ)的關(guān)聯(lián)概率,所以通過(guò)計(jì)算漢字之間的概率,就可以形成分詞的結(jié)果,需要的朋友可以參考下2023-04-04詳解Spring Boot實(shí)戰(zhàn)之Rest接口開(kāi)發(fā)及數(shù)據(jù)庫(kù)基本操作
本篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之Rest接口開(kāi)發(fā)及數(shù)據(jù)庫(kù)基本操作,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07Springboot整合Flowable6.x導(dǎo)出bpmn20的步驟詳解
這篇文章主要介紹了Springboot整合Flowable6.x導(dǎo)出bpmn20,Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義,可以十分靈活地加入你的應(yīng)用/服務(wù)/構(gòu)架,本文給出兩種從flowable導(dǎo)出流程定義bpmn20.xml的方式,需要的朋友可以參考下2023-04-04springboot 設(shè)置server.port不生效的原因及解決
這篇文章主要介紹了springboot 設(shè)置server.port不生效的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能,結(jié)合具體實(shí)例形式分析了java基于字符串遍歷與編碼轉(zhuǎn)換等操作實(shí)現(xiàn)五筆編碼獲取的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06