Elasticsearch的mapping講解


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

映射定義具有:

  • 元字段
    元字段用於自定義如何處理關聯的文檔元數據。包括文檔 _index,_id和 _source領域。
  • 字段或屬性
    映射包含properties與文檔相關的字段列表。

字段數據類型
每個字段都有一個數據type,可以是:

  • 簡單類型等text,keyword,date,long, double,boolean或ip。
  • 支持JSON的層次結構性質的類型,如 object或nested。
  • 或一種特殊類型的像geo_point, geo_shape或completion。

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

防止映射爆炸的設置
在索引中定義太多字段的情況可能導致映射爆炸,從而可能導致內存不足錯誤和難以恢復的情況。此問題可能比預期的更常見。例如,考慮一種情況,其中插入的每個新文檔都引入了新字段。這在動態映射中很常見。每次文檔包含新字段時,這些字段最終都會出現在索引的映射中。對於少量數據,這並不擔心,但是隨着映射的增長,它可能會成為問題。以下設置允許您限制可以手動或動態創建的字段映射的數量,以防止不良文檔導致映射爆炸:

index.mapping.total_fields.limit:索引中的最大字段數。字段和對象的映射以及字段別名都計入此限制。默認值為1000。

該限制已到位,以防止映射和搜索變得太大。較高的值可能導致性能下降和內存問題,尤其是在負載較高或資源很少的群集中。
如果增加此設置,建議您也增加該 indices.query.bool.max_clause_count設置,這將限制查詢中布爾子句的最大數量。

index.mapping.depth.limit:字段的最大深度,以內部對象的數量衡量。例如,如果所有字段都在根對象級別定義,則深度為1。如果存在一個對象映射,則深度為 2,等等。默認值為20。
index.mapping.nested_fields.limit:nested索引中 最大不同映射的數量,默認為50。
index.mapping.nested_objects.limit:nested單個文檔中所有嵌套類型 中JSON對象的最大數量,默認為10000。
index.mapping.field_name_length.limit:設置字段名稱的最大長度。默認值為Long.MAX_VALUE(無限制)。此設置實際上不能解決映射爆炸問題,但是如果您想限制字段長度,該設置可能仍然有用。通常不需要設置此設置。除非用戶開始添加大量名稱很長的字段,否則默認設置是可以的。

動態映射
字段和映射類型在使用之前不需要定義。通過動態映射,僅通過索引文檔即可自動添加新的字段名稱。可以將新字段添加到頂級映射類型以及內部object 和nested字段中。

可以將動態映射規則配置為自定義用於新字段的映射。

顯式映射
您對數據的了解超出了Elasticsearch的猜測,因此盡管動態映射對於入門非常有用,但有時您仍需要指定自己的顯式映射。

當你可以創建字段映射創建索引和 字段添加到現有的索引。

使用顯式映射創建索引
您可以使用create index API創建帶有顯式映射的新索引。

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

將字段添加到現有映射
您可以使用放置映射 API將一個或多個新字段添加到現有索引。

以下示例添加employee-id了keyword一個index映射參數值為的字段 false。這意味着該employee-id字段的值已存儲,但未索引或不可搜索。

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

更新字段的映射
除了支持的映射參數外,您無法更改現有字段的映射或字段類型。更改現有字段可能會使已經建立索引的數據無效。

如果您需要更改字段映射,創建具有正確映射一個新的索引和重新索引的數據轉換成指數。

重命名字段會使在舊字段名稱下已建立索引的數據無效。而是添加一個alias字段以創建備用字段名稱。

查看索引的映射
您可以使用get mapping API查看現有索引的映射。

GET my-index/_mapping

API返回以下響應:

{
  "my-index" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "email" : {
          "type" : "keyword"
        },
        "employee-id" : {
          "type" : "keyword",
          "index" : false
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

查看特定字段的映射
如果您只想查看一個或多個特定字段的映射,則可以使用get字段映射 API。

如果您不需要索引的完整映射或索引包含大量字段,這將很有用。

以下請求檢索該employee-id字段的映射。

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

API返回以下響應:

{
  "my-index" : {
    "mappings" : {
      "employee-id" : {
        "full_name" : "employee-id",
        "mapping" : {
          "employee-id" : {
            "type" : "keyword",
            "index" : false
          }
        }
      }
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM