在關(guān)系型數(shù)據(jù)庫中,得先創(chuàng)建表歹袁,指定字段和字段類型,才能將數(shù)據(jù)插入表中条舔。在ES中,索引就相當(dāng)于表孟抗,文檔就相當(dāng)于記錄,文檔里面的字段就相當(dāng)于表的字段凄硼,字段同樣有數(shù)據(jù)類型。mapping就用來定義文檔有哪些字段摊沉,這些字段如何存儲(chǔ)和索引狐史。
ES與關(guān)系型數(shù)據(jù)庫不同之處在于说墨,其不需要先定義表結(jié)構(gòu),而可以根據(jù)寫入文檔的內(nèi)容尼斧,來推斷字段和數(shù)據(jù)類型,創(chuàng)建索引結(jié)構(gòu)突颊,這就是dynamic mapping,動(dòng)態(tài)映射的由來律秃。這提供了極大的靈活性爬橡。
注:一個(gè)索引的字段數(shù)量有上限的糙申,超過上限就會(huì)報(bào)錯(cuò)。
dynamic參數(shù)設(shè)置
按dynamic值船惨,可分為下面三種模式
- 動(dòng)態(tài)模式(dynamic:true),根據(jù)輸入文檔的內(nèi)容粱锐,自動(dòng)推斷字段和類型,創(chuàng)建mapping
- 非動(dòng)態(tài)模式(dynamic:false)怜浅,無法根據(jù)輸入文檔的內(nèi)容蔬崩,自動(dòng)創(chuàng)建mapping,需要手動(dòng)創(chuàng)建mapping
- 嚴(yán)格模式(dynamic:strict)搀暑,同非動(dòng)態(tài)模式,區(qū)別在于自点,非動(dòng)態(tài)模式,輸入的文檔中如果有字段不在mapping中桂敛,依然可以存儲(chǔ)和讀取,但是該字段不在mapping中埠啃,因此也無法根據(jù)該字段進(jìn)行檢索伟恶;但嚴(yán)格模式碴开,無法存儲(chǔ)博秫,會(huì)直接報(bào)錯(cuò),嚴(yán)格模式實(shí)際上就類似于關(guān)系型數(shù)據(jù)庫中的表了挡育。
動(dòng)態(tài)模式(dynamic:true)
根據(jù)輸入文檔內(nèi)容巴碗,自動(dòng)創(chuàng)建mapping
step 1橡淆,es中還沒有index1索引,直接往index1中寫入文檔1
step 2母赵,這時(shí)候es中就有了索引index1,查詢index1的mapping
可見age被推斷成
long型
凹嘲,string類型的name被推斷成多字段類型,第一個(gè)類型是text
周蹭,第二個(gè)類型是keyword
。step 3凶朗,往已有的index1中寫入文檔2,出現(xiàn)了新的字段address
step 4,這時(shí)候address被自動(dòng)加入索引mapping中
動(dòng)態(tài)映射默認(rèn)有一個(gè)規(guī)則,即請求中文檔的什么json類型對應(yīng)es中什么數(shù)值類型矛绘,也可以通過動(dòng)態(tài)模板(dynamic template)來覆蓋這個(gè)規(guī)則,實(shí)現(xiàn)自定義推測規(guī)則货矮,具體可以參考ES官網(wǎng)。
上述字段age被推測成long類型囚玫,如果非要往age中寫入string類型的值,則會(huì)報(bào)錯(cuò)抓督。如下圖所示
非動(dòng)態(tài)模式(dynamic:false)
某些場景下铃在,不需要進(jìn)行動(dòng)態(tài)映射,如需要顯示設(shè)置mapping定铜。
step 1,顯式設(shè)置mapping揣炕,類似于關(guān)系型數(shù)據(jù)庫建表操作
step 2,查詢index2 mapping
step 3畸陡,插入文檔1,字段與mapping保持一致
step 4丁恭,插入文檔2,增加新的字段address
step 5涩惑,查詢index2的mappings,看是否
address
會(huì)自動(dòng)添加到mapping中step 6竭恬,查詢?nèi)课臋n跛蛋,可見文檔2中的
address
字段值痊硕,說明存儲(chǔ)成功step 7,在address字段上進(jìn)行匹配查詢岔绸,無法匹配到結(jié)果橡伞,將索引指定為非動(dòng)態(tài)映射后,無法進(jìn)行自動(dòng)推斷兑徘,但是該字段的值是可以被存儲(chǔ),可是無法在該字段上進(jìn)行查詢羡洛。
嚴(yán)格模式(dynamic:strict)
step 1欲侮,設(shè)置嚴(yán)格模式
step 2,寫入文檔1威蕉,增加了一個(gè)字段
address
,直接報(bào)錯(cuò)韧涨,連寫都寫不進(jìn)去了