Mapping是Elasticsearch中資料模組化的基礎,本文從Mapping簡介、Dynamic Mapping、自定義Mapping和Mapping常用參數說明4個部分介紹Elasticsearch如何設定Mapping。
Mapping類似資料庫中的表定義,主要作用如下:
定義索引下的字段名
定義字段的類型,比如數值型、字元串型、布爾型等
定義反向索引相關的配置,比如是否索引、記錄position等
使用API擷取Mapping:
request:<code>GET /test_index/_mapping</code>
response:
核心資料類型
字元串型:text、keyword
數值型:long、integer、short、byte、double、float、half_float、scaled_float
日期類型:date
布爾類型:boolean
二進制類型:binary
範圍類型:integer_range、float_range、long_range、double_range、data_range
複雜類型
數組類型:array
對象類型:object
嵌套類型:nested object
特殊類型
地理位置:geo_point、geo_shape、
IP位址:IPv4、IPv6
自動補全:complete
percolator
多字段特性:multi-fields
允許對同一字段采用不同的配置,比如分詞,常見例子如對人名實作拼音搜尋
實作方式:在人名中新增一個子字段為pinyin即可
在文檔寫入的時候,如果索引不存在,會自動建立索引
Dynamic Mapping的機制,使得無需手動定義Mapping,Elasticsearch會自動識别字段的類型,進而降低使用者的使用成本
但是有時候會推算的不對,例如位址位置資訊
當類型如果設定不對時,會導緻一些功能無法正常使用,例如Range查詢
ES依靠JSON文檔的字段類型來實作自動識别字段類型,支援的類型如下:
JSON類型
ES類型
null
忽略
boolean
浮點類型
float
整數
long
object
array
由第一個非null值的類型決定
string
比對日期格式,設定為Date(預設開啟);比對數字,設定為float或者long(預設關閉);設定為Text,并且增加keyword子字段
當建立Index的時候,dynamic字段可以設定成3種值:true、false、strict。
例如:
true
false
strict
文檔可索引
✅
❌
字段可索引
Mapping被更新
說明:
當設定成true的時候,文檔可以被索引,字段可以被搜尋,Mapping檔案可以更新。
當dynamic被設定成false的時候,新增字段的資料可以寫入ES;該資料可以被索引,但是新增字段不可被搜尋。
當設定成strict的時候,資料寫入直接報錯。
自定義Mapping的一些建議
可以參考API手冊,純手寫
為了減少工作量,減少出錯率,可以參考以下步驟:
建立一個臨時的index,寫入一些樣本資料
通過通路Mapping API獲得該臨時文本的動态Mapping定義
修改後,使用該配置建立索引
删除臨時索引
ES能否更改Mapping的字段類型,需要分兩種情況進行分析。
1. 新增字段
dynamic設定為true(預設值)時,一旦有新增字段的文檔寫入,Mapping也同時被更新。
dynamic設定為false時,Mapping不會被更新,更新字段的資料無法被索引,但是資訊會出現在_source中,換言之,文檔可以正常寫入,但是無法對字段進行搜尋。
dynamic設定為strict時,文檔寫入失敗。
2. 對已有字段,一旦已經有資料寫入,就不再支援修改字段定義。因為ES是基于Lucene實作的反向索引,一旦生成後,就不允許修改。因為如果修改了字段的資料類型,會導緻已被索引的資料無法被搜尋。如果希望修改字段類型,必須使用Reindex API進行重建索引。
copy_to
将該字段複制到目标字段,實作類似_all的作用;不會出現在_source中,隻用來搜尋
index
控制目前字段是否索引,預設為true,即記錄索引,false不記錄,即不可搜尋。
例如某些場景希望敏感資訊不用來做搜尋,可以将index設定為false,則不可以用來搜尋,也可以節省空間。
index_option用于控制反向索引記錄的内容,有4種配置:
docs隻記錄doc id
freqs記錄doc id和term frequencies
positions記錄doc id、term frequencies和term position
offsets記錄doc id、term frequencies、term position和character offsets
text類型預設配置為positions。其他預設是docs。當然記錄内容越多,占用空間越大。
null_value
當字段遇到null值時的處理政策,預設為null,即空值,此時es會忽略該值;可以通過設定該屬性設定字段的預設值。
更多常用參數可以參考:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html
由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!