第一個提議在大多數情況下都是最好的,但是因爲您需要針對其他字段的動態映射,所以第二個解決方案最簡單(創建一個禁用動態映射的子字段,根對象)。
1)dynamic:"false"
設置創建inner
物場:
POST dynamic
{
"mappings": {
"test": {
"properties": {
"inner": {
"type": "object",
"dynamic": false
}
}
}
}
}
2)添加一些值來測試(用領域,如new_string
和new_long
動態創建太):
PUT dynamic/test/1
{
"new_string":"lorem ipsum",
"inner":{
"sub_object":{
"field1": "value1",
"field2": 123
}
}
}
PUT dynamic/test/2
{
"new_long":1234,
"inner":{
"field3": "value2",
"field4": 123
}
}
3)由於默認情況下文檔的來源是存儲的,並且它正是您提供給ElasticSearch的JSON文檔,所以即使沒有索引或存儲,您也可以在響應中使用內部值:
"hits": [
{
"_index": "dynamic",
"_type": "test",
"_id": "1",
"_score": 1,
"_source": {
"new_string": "lorem ipsum",
"inner": {
"sub_object": {
"field1": "value1",
"field2": 123
}
}
}
},
{
"_index": "dynamic",
"_type": "test",
"_id": "2",
"_score": 1,
"_source": {
"new_long": 1234,
"inner": {
"field3": "value2",
"field4": 123
}
}
}
]
4)檢查映射看到new_string
和new_long
區域映射已創建:
"dynamic": {
"mappings": {
"test": {
"properties": {
"inner": {
"type": "object",
"dynamic": "false"
},
"new_long": {
"type": "long"
},
"new_string": {
"type": "string"
}
}
}
}
}
非常感謝這種反饋。你現在非常清楚這個解決方案。轉換原始文檔的缺點對我來說很有幫助(我想按原樣檢索原始文檔)。但正如你所說,如果沒有「完美」的存在,這可能是最好的解決方案。 – c2m
不客氣。最後一件事:小心如果你有非常大量的動態字段,因爲映射將相應地增長。 – ThomasC