目錄
- 一、問題現象
- 二、普通數組類型
- 1、為什么普通數組類型匹配不準?
- 三、nested類型
- 四、nested類型查詢操作
- 1、只根據nested對象內部數組條件查詢
- 2、只根據nested對象外部條件查詢
- 3、根據nested對象內部及外部條件查詢
- 4、向nested對象數組追加新數據
- 5、刪除nested對象數組某一個對象節點的數據
- 6、遍歷更新nested對象數組的數據
- 7、動態修改nested對象數組的數據
- 8、根據下標修改nested對象數組的數據
- 9、批量修改nested對象數組的數據
一、問題現象
問題現象:在實際項目中,一些數組存儲的字段,根據匹配條件去查詢經常會查詢到一些“其他不需要”的數據,為什么會出現這種情況?
----這種問題現象,就是ES的Object類型的數據扁平化存儲問題。
nested類型是object一種數據類型,對象數組的優先選擇類型。Nested將數組中的每個對象作為單獨的隱藏文檔(hidden separate document)進行索引。nested屬于object類型的一種,是Elasticsearch中用于復雜類型對象數組的索引操作。
nested類型數據是單獨存儲很耗資源,因此默認一個index最多只有50個nested字段。此外,雖然nested是單獨存儲的,但是其字段數也算入index總字段數,默認最多1000個。
二、普通數組類型
普通數組的mapping參數設置
"word_one": {"properties": {"desc": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"no": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"sid": {"type": "long"},"sign": {"type": "boolean"}}}
現在進行搜索sid、desc字段數據。
現象結論:word_one是普通數組List,多個must匹配條件會匹配整個List數組數據,而不是每個Bean去匹配。
1、為什么普通數組類型匹配不準?
原因分析:當字段是普通數組類型,其實在ES中,每個對象元素的屬性值被扁平化存儲在了數組中,已丟失了對應關系,因此無法保證搜索的準確。
{"app_id": "42533","word_one": [{"desc": "南京有好高中么","no": "0963","sid": 2002,"sign": false},{"desc": "雨花區面積多大","no": "05380","sid": 2003,"sign": false}]}
被扁平化存儲到ES中,如下所示
{"app_id"