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

来源:https://www.cnblogs.com/shoufeng/archive/2019/04/03/10648835.html
-Advertisement-
Play Games

Elasticsearch的映射(mapping)是什麼? 在創建索引時, 如何對不同的數據類型進行特殊的配置與操作? 映射(mapping)有哪些組成部分? 如何配置和更新mapping? 這篇文章通通告訴你. ...


目錄

1 映射的相關概念

1.1 什麼是映射

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

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

需要註意的是: 檢索時用到的分析策略, 要和建立索引時的分析策略相同, 否則將導致數據不准確.

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

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

1.2 映射的組成

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

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

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

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

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"
          }
        }
      }
    }
  }
}

版權聲明

作者: ma_shoufeng(馬瘦風)

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

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

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 併在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql遍歷節點的所有子節點 DELIMITER // CREATE FUNCTION `getChildrenList`(rootId INT) RETURNS VARCHAR(500) BEGIN DECLARE sTemp VARCHAR(500); DECLARE sTempChd VAR... ...
  • mysql創建存儲過程 mysql 存儲過程有參數輸入拼接 mysql存儲過程含輸入參數的拼接的分頁 ...
  • 本文適合初學JAVA,要用到MySQL開發的學習者。 第一步、下載MySQL 1. 百度mysql,找到官網,點擊進入。 2. 進入官網,點擊DOWNLOADS,在DOWNLOADS菜單欄中點擊Community,接著在左側菜單欄中找到MySQL Community Server, 點擊進入。 3. ...
  • 以下命令均在mysql命令行下執行。1. 修改表名稱有2種方法,mysql命令行,沒有區分大小寫,方法1:mysql>ALTER TABLE 表名l RENAME TO 表名2; 方法2:mysql>rename table 表名1 to 表名2; 2. 修改表中的欄位預設值,mysql>ALTER ...
  • 1、mysqladmin語句: # 查看mysql版本 mysqladmin version # 更改root用戶密碼 mysqladmin -u root -p原密碼 password '新密碼' # 查看資料庫是否可用 mysqladmin -uroot -p ping # 創建資料庫 mysq ...
  • 很久沒有使用命令行操作Mysql,百度搜羅,重新整理,加強記憶,便於查詢。 以下命令均在win7,64位操作系統下,cmd命令行操作; 一、創建1個Mysql 資料庫 二、刪除1個Mysql資料庫 ...
  • 這是國外數據科學學習平臺DataCamp成員寫的一篇圖文《8步成為數據科學家》。我們具體來看下有哪些學習內容和學習資源。 ...
  • AIX 7.2 下Oracle 11.2.0.4 RAC資料庫root用戶在使用 /u01/app/11.2.0/grid/OPatch/opatch auto /soft/28813878 -ocmrf /soft/ocm.rsp 安裝11.2.0.4.20190115 PSU時,遇到 patch ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...