第四章 Elasticsearch mapping

摘要

映射是定義文檔及其包含的字段,存儲和索引方式的過程。例如,使用映射定義:

  1. 哪些字符串字段應視爲全文字段
  2. 哪些字段包含數字,日期或地理位置
  3. 日期字段的格式。
  4. 自定義規則,用於控制動態添加字段的映射 。
  5. 元字段,Mate-fields。被用於自定義如何處理關聯文檔,例如:_index, _id, _source
  6. 字段,屬性。包含屬性與文檔相關的字段列表

元字段

每個文檔都有與之關聯的元數據,例如_index,映射 _type_id元字段。創建映射類型時,可以自定義其中一些元字段的行爲。

標記文檔位置的元字段

  1. _index, 文檔所屬的索引。
  2. _type,文檔的映射類型
  3. _id,文檔的主鍵

文檔源 元字段

  1. _source,表示文檔正文的原始JSON。
  2. _size,由插件mapper-size _source提供的字段大小(以字節爲單位)

索引元字段

  1. _field_names,文檔中包含非空值的所有字段。
  2. _ignored,由於ignore_malformed,導致在索引的時候,被忽略的文檔中的所有字段。

路由元字段

_routing,一個自定義的路由值,用於將文檔路由到特定的分片。

其他元領域編輯

_meta,特定於應用程序的元數據。

字段數據類型

爲不同的目的而以不同的方式對同一字段建立索引,通常很有用。例如,一個string字段可以被索引爲text全文搜索的字段,也可以被索引keyword爲排序或聚合的字段。或者,您可以使用standard分析器, english分析器和 french分析器爲字符串字段建立索引。

大多數數據類型通過fields參數支持multi-fields

詳情請看

動態映射

字段和映射不需要在使用之前定義。通過動態映射,僅通過索引文檔即可自動添加新的字段名稱。新字段可以添加到頂級映射類型中,也可以添加到嵌套類型中。
可以將動態映射規則配置爲自定義用於新字段的映射。
Elasticsearch的最重要功能之一是它試圖擺脫束縛,讓您儘快開始探索數據。要爲文檔建立索引,您不必先創建索引,定義映射類型並定義字段-您只需爲文檔建立索引,索引,類型和字段就會自動生效。簡單的來說,您在創建索引文檔時,如果索引在Elasticsearch 中不存在,Elasticsearch 會自動根據您的文檔生成相應的索引和索引映射類型。

自動檢測和添加新字段稱爲 動態映射。可以通過以下方式自定義動態映射規則以適合您的目的:

  1. 動態字段映射,管理動態檢測的規則
  2. 動態模版,用於爲動態添加的字段配置映射的自定義規則
  3. 索引模板允許您配置新索引的默認映射,設置和別名,無論是自動創建還是顯式創建。

顯式映射

您對數據的瞭解超出了Elasticsearch的猜測,因此儘管動態映射對於入門非常有用,但有時您仍需要指定自己的顯式映射。
當你可以創建字段映射創建索引和 字段添加到現有的索引。

新建一個索引

PUT /my-index
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}

添加新字段到已存在的索引中

PUT /my-index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

修改字段映射

除了支持的映射參數外,您不能更改現有的字段的映射或字段類型。更改現有字段可能會導致已經建立索引的數據無效。
如果您需要更改字段索引,可以首先創建具有正確映射的一個索引,然後將您的數據重定向到原來的索引中。重命名字段會使在舊字段名稱下已建立索引的數據無效。而是添加一個alias字段以創建備用字段名稱。或者說,如果可以的話,直接將原索引的數據複製到新索引中。

查看索引映射關係

GET /my-index/_mapping

查看索引某個字段的映射類型

GET /my-index/_mapping/field/employee-id

防止映射爆炸的設置

在索引中定義太多字段會導致映射爆炸,這可能會導致內存不足錯誤和難以恢復的情況。
考慮一種情況,其中插入的每個新文檔都引入了新字段,例如帶有動態映射的字段。每個新字段都添加到索引映射中,隨着映射的增長,這可能會成爲問題。

使用以下設置來限制(手動或動態創建的)字段映射的數量,並防止文檔引起映射爆炸:

index.mapping.total_fields.limit

索引中最大字段數,字段和對象映射以及字段的別名都計入此限制,默認值爲1000
如果這個值較大,可能會導致性能下降和內存問題,尤其是在負載較高或資源很少的集羣中。

index.mapping.depth.limit

字段的最大深度,以內部對象的數量衡量。例如,如果所有字段都在根對象級別定義,則深度爲1。如果存在一個對象映射,則深度爲 2,等等。默認值爲20。

index.mapping.nested_fields.limit

nested索引中 最大不同映射的數量。nested僅在需要相互獨立地查詢對象數組時,才應在特殊情況下使用該類型。爲了防止設計不良的映射,此設置限制了nested每個索引的唯一類型的數量。默認值爲50。

index.mapping.nested_objects.limit

單個文檔可跨所有nested類型包含的最大嵌套JSON對象數 。當文檔包含太多嵌套對象時,此限制有助於防止出現內存不足錯誤。默認值爲10000。

index.mapping.field_name_length.limit

設置字段名稱的最大長度。此設置實際上不能解決映射爆炸問題,但是如果您想限制字段長度,該設置可能仍然有用。通常不需要設置此設置。除非用戶開始添加名稱非常長的大量字段,否則默認設置是可以的。默認值爲 Long.MAX_VALUE(無限制)。

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