當ES在文檔中碰到1個之前沒見過的字段時,它會利用動態映照來決定該字段的類型,并自動地對該字段添加映照。
有時這正是需要的行動,但有時不是。你也許不知道在以后你的文檔中會添加哪些字段,但是你想要它們能夠被自動地索引。也許你只是想要疏忽它們。或 - 特別當你將ES當作主要的數據存儲使用時 - 大概你會希望這些未知的字段會拋出異常來提示你注意這1問題。
榮幸的是,你可以通過dynamic
設置來控制這1行動,它能夠接受以下的選項:
true
:默許值。動態添加字段false
:疏忽新字段strict
:如果碰到陌生字段,拋出異常
dynamic
設置可以適用在根對象上或object
類型的任意字段上。你應當默許地將dynamic
設置為strict
,但是為某個特定的內部對象啟用它:
在my_type
對象上如果碰到了未知字段則會拋出1個異常。 在stash
對象上會動態添加新字段。
通過以上的映照,你可以向stash
添加新的可搜索的字段:
但是,如果在頂層對象上試圖添加新字段則會失敗:
NOTE
將
dynamic
設置為false
其實不會改變_source
字段的內容 -_source
字段依然會保存你索引的全部JSON文檔。只不過是陌生的字段將不會被添加到映照中,以致于它不能被搜索到。
如果你知道你需要動態的添加的新字段,那末你或許會啟用動態映照。但是有時動態映照的規則又有些不夠靈活。榮幸的是,你可以調劑某些設置來讓動態映照的規則更加合適你的數據。
date_detection
當ES碰到1個新的字符串字段時,它會檢查該字串是不是含有1個可被辨認的日期,比如2014-01-01
。如果存在,那末它會被辨認為1個date
類型的字段。否則會將它作為string
進行添加。
有時這類行動會致使1些問題。如果你想要索引1份這樣的文檔:
假定這是note
字段第1次被發現,那末根據規則它會被作為date
字段添加。但是如果下1份文檔是這樣的:
這時候該字段明顯不是日期,但是已太遲了。該字段的類型已是日期類型的字段了,因此這會致使1個異常被拋出。
可以通過在根對象上將date_detection
設置為false
來關閉日期檢測:
有了以上的映照,1個字符串總是會被當作string
類型。如果你需要1個date
字段,你需要手動地添加它。
NOTE
ES中辨認日期的方法可以通過
dynamic_date_formats
設置改變。
dynamic_templates
通過dynamic_templates
,你可以具有對新字段的動態映照規則具有完全的控制。你設置可以根據字段名稱或類型來使用1個不同的映照規則。
每一個模板都有1個名字,可以用來描寫這個模板做了甚么。同時它有1個mapping
用來指定具體的映照信息,和最少1個參數(比如match
)用來規定對甚么字段需要使用該模板。
模板的匹配是有順序的 - 第1個匹配的模板會被使用。比如我們可以為string
字段指定兩個模板:
es
:以_es
結尾的字段應當使用spanish
解析器en
:其它所有字段使用english
解析器
我們需要將es
模板放在第1個,由于它相比能夠匹配所有字符串字段的en
模板更加具體:
match_mapping_type
允許你只對特定類型的字段使用模板,正如標準動態映照規則那樣,比如string
,long
等。
match
參數只會匹配字段名,path_match
參數用于匹配對象中字段的完全路徑,比如address.*.name
可以匹配以下字段:
unmatch
和path_unmatch
模式能夠用來排除某些字段,沒有被排除的字段則會被匹配。
更多的配置選項可以在根對象的參考文檔中找到。