Elasticsearch映射——映射到底設置了什麼?

關於版本

內容 版本
Elasticsearch版本 7.2.0
JAVA依賴版本 7.2.1

索引映射

索引的映射相當於數據庫中的表結構,這裏我之前在相關文章中已經接單介紹過了Elasticsearch基礎04——映射的操作。只不過當時只是簡單介紹了下映射的相關操作,並沒有詳細介紹映射包含哪些內容。

映射的創建

和傳統數據庫不同,傳統的數據庫我們嘗試向表中插入數據的前提是這個表已經存在數據結構的定義,且插入數據的字段要在表結構中被定義。而ES的映射的創建支持主動和被動創建。

被動創建(動態映射)

此時字段和映射類型不需要事先定義,只需要存在文檔的索引,當向此索引添加數據的時候當遇到不存在的映射字段,ES會根據數據內容自動添加映射字段定義。

動態映射規則

使用動態映射的時候,根據傳遞請求數據的不同會創建對應的數據類型

JSON中數據類型 Elasticsearch 數據類型
null 不添加任何字段
true或者false boolean類型
浮點數據 float類型
integer數據 long類型
object object類型
array 取決於數組中的第一個非空值的類型。
string 如果此內容通過了日期格式檢測,則會被認爲是date數據類型。如果此值通過了數值類型檢測則被認爲是double或者long數據類型,帶有關鍵字子字段會被認爲一個text字段

主動創建(顯示映射)

動態映射只能保證最基礎的數據結構的映射,所以很多時候我們需要對字段除了數據結構定義更多的限制的時候,動態映射創建的內容很可能不符合我們的需求,所以可以使用PUT {index}/mapping來更新指定索引的映射內容。

設置防止映射過大

爲索引中的列定義太多太大的字段會使得映射變得十分臃腫,從而導致內存錯誤和難以恢復的情況。尤其在使用動態映射的時候,新的數據中假如攜帶不存在的字段數據時系統會自動添加新的字段,假如不做出限制會使映射字段變得非常多。目前ES支持設置的參數有下面幾個

可以設置的內容:

參數 說明
index.mapping.total_fields.limit
限制索引中字段的最大數量。默認值是1000。
index.mapping.depth.limit 字段結構中定義的最大深度,基於根節點定義的字段深度爲1,,如果有一個對象映射,則深度爲2,依此類推。默認值是20。
index.mapping.nested_fields.limit 索引中嵌套類型的最大數目,默認爲50。
index.mapping.nested_objects.limit 索引嵌套類型的單個文檔內嵌套JSON對象的最大數量,默認爲10000。
index.mapping.field_name_length.limit 自定名稱的最大長度,模型情況下是沒有限制的。

映射中可以設置的數據類型

這個內容我之前在Elasticsearch基礎05——字段類型中已經介紹過了,上面有對數據字段的簡單介紹。

映射類型(Mapping Type)

6.X之後此部分已經刪除

映射中的元信息字段

在創建映射的時候我們定義的字段內容並非映射中所有的字段,每個文檔都存在一些和系統有關的元數據,這些數據被存儲在映射的元字段中。

根據元數據的作用不同可以分爲下面幾部分:

  • 文檔特徵元信息
  • 文檔數據源元信息
  • 索引原信息
  • 路由原信息
  • 自定義元信息

文檔特徵元信息

字段 說明
_index 文檔所屬的索引
_type 文檔的映射類型。6.X之後已刪除
_id 文檔的ID

文檔數據源元信息

字段 說明
_source 表示文檔主體的原始JSON
_size _source字段的大小(以字節爲單位)

需要注意的_size並不是默認就存在的。此字段需要mapper-size插件提供,該字段會以字節爲單位索引_source字段的大小。

索引原信息

字段 說明
_field_names 用來索引文檔中包含除了null之外的任何值得字段的名稱
_ignored 該字段索引並存儲文檔中因爲格式錯誤而被忽略的字段的名稱

路由原信息

字段 說明
_routing 將文檔路由到特定碎片的自定義路由值

在創建文檔的時候添加路由參數,這樣通過爲每個文檔指定自定義路由值來實現自定義路由模式。

PUT offline_sales/_doc/abc?routing=abcd
{
   ......
}

針對自定義路由的數據進行查詢的時候可以獲得_routing元信息

{
  "_index" : "offline_sales",
  "_type" : "_doc",
  "_id" : "abc",
  "_version" : 1,
  "_seq_no" : 9,
  "_primary_term" : 1,
  "_routing" : "abcd",
  "found" : true,
  "_source" : {
    ......
  }
}

自定義元信息

字段 說明
_meta 此字段可以定義一些自定的信息,這些信息Elasticsearch不會使用他們,但是用戶可以用其來保存特定的元數據,比如版本信息等。

映射創建時候參數設置

除了對字段的定義,Mapping創建的時候提供了一些對於查詢策略和自身定義的參數配置。下面只是簡單介紹下映射支持的字段參數內容。

參數 說明
analyzer 定義此字段索引時使用的分詞方式
normalizer normalizer功能類似於analyzer,但是其可以使查詢條件輸出唯一的查詢條件(可以認爲其只是實現了條件小寫等不會產生多個查詢條件的相關操作)
boost 定義當前字段的查詢權重
coerce 此字段控制是否嘗試修復部分錯誤的數據格式,(比如對一個整數字段插入字符串比如"5",此時此字符串可以被解析爲數字),默認爲true
copy_to 類似於別名,不同之處參數可以將此字段內容複製到指定字段中,多個字段可以複製到同一個字段中
doc_values 倒排索引雖然可以快速查詢文檔中內容,但是在進行排序或聚合操作的時候,倒排索引並不能獲得文檔內容,所以需要存儲一份文檔數據到doc_values,而此參數控制字段是否需要存儲在doc_values中的開關。
dynamic 是否開啓動態映射,目前支持三個參數:true/false 開啓和關閉,strict 當出現未定義的字段,拋出異常並拒絕添加文檔
enabled 此參數控制字段是否可以被索引,當被設置爲false的時候表示此字段僅用來存儲而無需索引,此時ES不會分析此字段內的數據,所以即使插入的非法的數據內容ES依舊允許執行
fielddata 類似doc_values都是單獨存儲額外的文檔數據,這樣通過倒排索引獲取文檔內容,從而實現在排序和聚合上的功能。不同的是doc_values不支持text格式,text格式數據需要使用fielddata。此參數默認是禁止的,這是因爲在第一次對字段進行排序或聚合的時候它會把這個列數據都加載到內存中,這樣會帶來大量的內存消耗。
eager_global_ordinals 是否使用全局序號來進行聚合。主要在聚合分析構建hash的時候,使用序號來替代doc的值,這樣在文檔收集階段根據需要收集到各個桶中,在計算結果時將序號轉換爲具體doc內容。但是此操作在每次查詢時需要重建doc序號關係
format 日期類型字段用來解析的日期格式
ignore_above 當插入字段長度超過此字段設置的值後,此內容將不被索引或存儲。對於數組結構字段會作用到每一個元素
ignore_malformed 當向一個字段插入錯誤的數據類似時,會拋出異常並拒絕文檔。但設置此參數後,對字段插入錯誤的數據時會忽略異常,此文檔錯誤的數據將不被索引,但是其他字段則正常。
index_options 控制將哪些信息添加到反向索引中
index_phrases 主要將兩個單詞的組合索引到單獨字段中,這樣在進行精確的短語查詢的時候會更有效。支持true和false參數。默認爲false。此參數會使索引變大
index_prefixes 允許對字段的前綴進行索引,此參數用來提高查詢的速度
index 控制字段是否可以被索引,被設置爲false的字段無法被索引到
fields 此參數可以爲同一個字段設置不同的索引方式,但是在_source字段中只會保存一份,並不會實際增加存儲。但是會增加索引大小
norms norms裏面存儲的是各種各樣的歸一化因子,此內容會影響到文檔的得分,在不需要對字段進行打分的時候可以禁用此參數,需要注意的是對於keyword字段默認爲false
null_value 一般來說空值是無法被索引的,但是此參數允許使用指定的值替換空值,以對其進行索引
position_increment_gap 增加近似值匹配
properties 定義類型映射、對象字段和嵌套字段等數據
search_analyzer 定義此字段查詢時使用的分詞方式
similarity 此參數可以配置用來計算字段相似性的算法
store 默認情況下字段內容會被索引但是並不會存儲字段中的值,想獲取字段中的值則需要在_source中獲取對應字段的數據,當查詢僅僅是嘗試獲取指定字段的內容的時候,可以設置此參數爲true,那麼系統可以直接獲取此字段的內容,不再嘗試獲取_source中的數據。
term_vector 術語向量的定義,存儲一些術語向量,以便可以爲特定文檔檢索它們

上面只是對映射參數的簡單整理,裏面很多參數都涉及到Elasticsearch的查詢優化、存儲優化以及不同的查詢以及分析功能的實現。僅僅使用一句話是沒法解釋其作用的效果。後續我會根據功能,對其中部分字段進行介紹。


個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章