在使用es存儲(chǔ)數(shù)據(jù)時(shí),嵌套json是非常常見(jiàn)的操作,但是當(dāng)嵌套的json中存在字段名重復(fù)時(shí),就會(huì)出現(xiàn)一些問(wèn)題。
首先,我們來(lái)看一下以下簡(jiǎn)單的嵌套json示例:
{ "name": "Alice", "age": 24, "address": { "province": "Shanghai", "city": "Shanghai", "street": "No.1234, Lane 567" } }
在上面的例子中,address是一個(gè)嵌套的json對(duì)象,包含了province、city和street字段。這個(gè)例子中并沒(méi)有出現(xiàn)字段名重復(fù)的情況,所以我們可以直接將其存儲(chǔ)到es中。
PUT /user/_doc/1 { "name": "Alice", "age": 24, "address": { "province": "Shanghai", "city": "Shanghai", "street": "No.1234, Lane 567" } }
但是,如果嵌套json中出現(xiàn)了字段名重復(fù)的情況,那么該怎么處理呢?
我們來(lái)看下面的例子:
{ "name": "Bob", "age": 25, "address": { "province": "Beijing", "city": "Beijing", "street": "No.5678, Lane 910" }, "city": "Shanghai" }
在這個(gè)例子中,address中的city和json對(duì)象本身的city字段名重復(fù)了。這種情況下,我們可以通過(guò)修改mapping來(lái)解決這個(gè)問(wèn)題。
我們需要為這個(gè)字段添加一個(gè)前綴來(lái)進(jìn)行區(qū)分,比如我們可以將address中的city改成address_city:
PUT /user/_mapping { "properties": { "address_city": { "type": "text" } } }
然后將數(shù)據(jù)存儲(chǔ)到es中:
PUT /user/_doc/2 { "name": "Bob", "age": 25, "address": { "province": "Beijing", "address_city": "Beijing", "street": "No.5678, Lane 910" }, "city": "Shanghai" }
這樣,我們就可以成功將數(shù)據(jù)存儲(chǔ)到es中了,同時(shí)也成功避免了字段名重復(fù)的問(wèn)題。