ES 11 - 配置Elasticsearch的映射 (mapping)

1 映射的相關概念

1.1 什麼是映射

(1) 映射(mapping): 定義index的元數據, 指定要索引並存儲的文檔的字段類型.json

也就是說映射決定了Elasticsearch在創建倒排索引、進行檢索時對文檔採起的相關策略, 如數字類型、日期類型、文本類型等等.bash

須要注意的是: 檢索時用到的分析策略, 要和創建索引時的分析策略相同, 不然將致使數據不許確.app

(2) ES對不一樣的類型有不一樣的存儲和檢索策略.ui

① 好比: 對full text型的數據類型(如text), 在索引時, 會通過各種處理 (包括分詞、normalization(時態轉換、同義詞轉換、大小寫轉換)等處理), 纔會創建到索引數據中.
② 再好比: 對exact value(如date), 在索引的分詞階段, 會將整個value做爲一個關鍵詞創建到倒排索引中.code

1.2 映射的組成

每一個index都有一 (至多) 個type, 每一個type對應一個mapping.orm

在Elasticsearch 6.X版本開始, 1個index只能有1個type.blog

每一個mapping都由下述部分組成:索引

① 元字段: _index_type_id_source.
② field/properties(字段或屬性): 同一index中, 同名的field的映射配置必須相同rem

a) 由於index是根據_type元字段來區分type的, 也就是存儲的每一個文檔中都有_type等元字段, 若是相同名稱的field的映射(_type字段的值)不一樣, Elasticsearch在解析時就會出現衝突.

b) 這些參數能夠例外: copy_to、dynamic、enabled、ignore_above、include_in_all.

關於type的處理方法, 能夠參考博客: ES XX - Elasticsearch對type的處理(type的底層結構).

1.3 元字段

每一個文檔都有與之關聯的元數據 —— ES內部爲全部的文檔配備的field, 都是如下劃線_開頭的內置字段.

具體的內容請參考博文 ES XX - Elasticsearch的元字段 中詳細講解.

1.4 字段的類型

Elasticsearch中每一個field都對應一至多個數據類型.

詳細的內容請參考博文 ES XX - Elasticsearch中字段的類型 中詳細講解.

2 如何配置mapping

2.1 建立mapping

(1) 必讀說明:

① 建立mapping時, 能夠指定每一個field是否須要:

索 引: "index": true —— 默認配置
不索引: "index": false

mapping root object:

每一個type對應的mapping的JSON串, 包括properties, metadata(_id, _source, _type) , settings(analyzer) , 其餘settings(如include_in_all)

(2) 建立mapping的示例:

需求: 建立名爲website的索引, 包含一個user類型. user類型中禁用元字段_all.

PUT website
{
    "mappings": {
        "user": {       // 這就是一個root object
            "_all": { "enabled": false },  // 禁用_all字段
            "properties": {
                "user_id": { "type": "text" },
                  "name": {
                    "type": "text",
                    "analyzer": "english"
                },
                "age": { "type": "integer" },
                "sex": { "type": "keyword" },
                "birthday": {
                    "type": "date", 
                    "format": "strict_date_optional_time||epoch_millis"
                },
                "address": {
                    "type": "text",
                    "index": false         // 不分詞
                }
            }
        }
    }
}

(3) 過時提示說明 —— 這裏使用的是Elasticsearch 6.6.10版本:

① 是否索引的API已經作了修改, 若使用"analyzed" | "not_analyzed" | "yes" | "no"等, 將拋出以下警告:

#! Deprecation: Expected a boolean [true/false] for property [index] but got [not_analyzed]
#! Deprecation: Expected a boolean [true/false] for property [index] but got [no]

_all元字段也將在7.0版本中移除, 它建議咱們使用copy_to定製本身的all field:

#! Deprecation: [_all] is deprecated in 6.0+ and will be removed in 7.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.

2.2 更新mapping

(1) 必讀說明:

  • 映射一旦建立完成, 就不容許修改:

    —— Elasticsearch對文檔的分析、存儲、檢索等過程, 都是嚴格按照mapping中的配置進行的. 若是容許後期修改mapping, 在檢索時對索引的處理將存在不一致的狀況, 致使數據檢索行爲不許確.

  • 只能在建立index的時候手動配置mapping, 或者新增field mapping, 可是不能update field mapping.

(2) 更新mapping出現異常:

  • 修改已經建立好的mapping

    PUT website
    {
        "mappings": {
            "user": {
                "properties": {
                    "author_id": { "type": "text" }
                }
            }
        }
    }
  • 拋出以下錯誤 —— 索引已經存在的異常:

    {
      "error": {
        "root_cause": [
          {
            "type": "resource_already_exists_exception",
            "reason": "index [website/mVYk4-a7RMOZbkcCp2avfw] already exists",
            "index_uuid": "mVYk4-a7RMOZbkcCp2avfw",
            "index": "website"
          }
        ],
        "type": "resource_already_exists_exception",
        "reason": "index [website/mVYk4-a7RMOZbkcCp2avfw] already exists",
        "index_uuid": "mVYk4-a7RMOZbkcCp2avfw",
        "index": "website"
      },
      "status": 400
    }

(3) 向mapping中添加新type:

  • 向已有mapping中添加字段及其映射信息:

    PUT website/_mapping/user     // 修改user類型的_mapping, 注意API的順序
    {
        "properties": {
            "new_field": {
                "type": "text",
                "index": false
            }
        }
    }

2.3 查看mapping

(1) 查看mapping的API:

GET website/_mapping

(2) 查看的結果信息以下:

{
  "website" : {
    "mappings" : {
      "user" : {
        "_all" : {
          "enabled" : false        // 禁用元字段_all
        },
        "properties" : {
          "address" : {
            "type" : "text",
            "index" : false        // 不索引
          },
          "age" : {
            "type" : "integer"
          },
          "birthday" : {
            "type" : "date"
          },
          "name" : {
            "type" : "text",
            "analyzer" : "english"
          },
          "new_field" : {          // 後期添加的新字段
            "type" : "text",
            "index" : false        // 不索引
          },
          "sex" : {
            "type" : "keyword"
          },
          "user_id" : {
            "type" : "text"
          }
        }
      }
    }
  }
}

版權聲明

做者: 馬瘦風

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主全部, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文連接, 不然博主保留追究相關人員法律責任的權利.

相關文章
相關標籤/搜索