動態對映 Dynamic Mapping

2021-09-02 12:59:06 字數 2143 閱讀 3243

當es在文件中碰到乙個以前沒見過的字段時,它會利用動態對映來決定該字段的型別,並自動地對該字段新增對映。

有時這正是需要的行為,但有時不是。你或許不知道在以後你的文件中會新增哪些字段,但是你想要它們能夠被自動地索引。或許你只是想要忽略它們。或者 - 尤其當你將es當做主要的資料儲存使用時 - 大概你會希望這些未知的字段會丟擲異常來提醒你注意這一問題。

幸運的是,你可以通過dynamic設定來控制這一行為,它能夠接受以下的選項:

dynamic設定可以適用在根物件上或者object型別的任意欄位上。你應該預設地將dynamic設定為strict,但是為某個特定的內部物件啟用它:

put /my_index

, "stash"

: }}}

}

my_type物件上如果碰到了未知欄位則會丟擲乙個異常。 在stash物件上會動態新增新字段。

通過以上的對映,你可以向stash新增新的可搜尋的字段:

put /my_index/my_type/1

}

但是,如果在頂層物件上試圖新增新字段則會失敗:

put /my_index/my_type/1

note

dynamic設定為false並不會改變_source欄位的內容 -_source字段仍然會儲存你索引的整個json文件。只不過是陌生的字段將不會被新增到對映中,以至於它不能被搜尋到。

如果你知道你需要動態的新增的新字段,那麼你也許會啟用動態對映。然而有時動態對映的規則又有些不夠靈活。幸運的是,你可以調整某些設定來讓動態對映的規則更加適合你的資料。

當es碰到乙個新的字串欄位時,它會檢查該字串是否含有乙個可被識別的日期,比如2014-01-01。如果存在,那麼它會被識別為乙個date型別的字段。否則會將它作為string進行新增。

有時這種行為會導致一些問題。如果你想要索引乙份這樣的文件:

假設這是note字段第一次被發現,那麼根據規則它會被作為date字段新增。但是如果下乙份文件是這樣的:

這時該欄位顯然不是日期,但是已經太遲了。該字段的型別已經是日期型別的字段了,因此這會導致乙個異常被丟擲。

可以通過在根物件上將date_detection設定為false來關閉日期檢測:

put /my_index

}}

有了以上的對映,乙個字串總是會被當做string型別。如果你需要乙個date字段,你需要手動地新增它。

note

通過dynamic_templates,你可以擁有對新字段的動態對映規則擁有完全的控制。你設定可以根據欄位名稱或者型別來使用乙個不同的對映規則。

模板的匹配是有順序的 - 第乙個匹配的模板會被使用。比如我們可以為string字段指定兩個模板:

我們需要將es模板放在第乙個,因為它相比能夠匹配所有字串欄位的en模板更加具體:

put /my_index

}},}}

]}}}

match引數只會匹配欄位名,path_match引數用於匹配物件中字段的完整路徑,比如address.*.name可以匹配如下字段:

}}

unmatchpath_unmatch模式能夠用來排除某些字段,沒有被排除的字段則會被匹配。

動態對映和靜態對映

先說virtualalloc和virtualcopy virtualalloc 首先會從我們的虛擬位址空間中申請 或者說預留 一塊虛擬空間,準備接下來要用它。注意此時,可用的物理記憶體並沒有減少,只是虛擬位址少了一塊可用的區域。真正把這塊之前 reserved 的虛擬空間對映到物理的記憶體區域就是由...

ibatis 動態對映

在複雜查詢過程中,我們常常需要根據使用者的選擇決定查詢條件,這裡發生變化的並不只是sql 中的引數,包括select 語句中所包括的字段和限定條件,都可能發生變化。典型情況,如在乙個複雜的組合查詢頁面,我們必須根據使用者的選擇和輸入決定查詢的條件組合。乙個典型的頁面如下 對於這個組合查詢頁面,根據使...

elasticsearch 動態對映

來確定欄位的資料型別並自動把新的字段新增到型別對映。有時這是想要的行為有時又不希望這樣。通常沒有人知道以後會有什麼新字段加到文件,但是又希望這些欄位被自動的索引。也許你只想忽略它們。如果elasticsearch是作為重要的資料儲存,可能就會期望遇到新字段就會丟擲異常,這樣能及時發現問題。幸運的是可...