ElasticSearch 動態映射與靜態映射

鬆哥原創的 Spring Boot 視頻教程已經殺青,感興趣的小夥伴戳這裏-->Spring Boot+Vue+微人事視頻教程java


ElasticSearch 系列第十一篇,和你們聊一聊索引的基本操做,前十篇傳送門:web

  1. 打算出一個 ElasticSearch 教程,誰同意,誰反對?
  2. ElasticSearch 從安裝開始
  3. ElasticSearch 第三彈,核心概念介紹
  4. ElasticSearch 中的中文分詞器該怎麼玩?
  5. ElasticSearch 索引基本操做
  6. ElasticSearch 文檔的添加、獲取以及更新
  7. ElasticSearch 文檔的刪除和批量操做
  8. ElasticSearch 文檔路由,你的數據到底存在哪個分片上?
  9. ElasticSearch 併發的處理方式:鎖和版本控制
  10. ElasticSearch 中的倒排索引究竟是什麼?

如下是視頻筆記:數據庫

注意,筆記只是視頻內容的一個簡要記錄,所以筆記內容比較簡單,完整的內容能夠查看視頻。微信

映射就是 Mapping,它用來定義一個文檔以及文檔所包含的字段該如何被存儲和索引。因此,它其實有點相似於關係型數據庫中表的定義。併發

9.1 映射分類

動態映射app

顧名思義,就是自動建立出來的映射。es 根據存入的文檔,自動分析出來文檔中字段的類型以及存儲方式,這種就是動態映射。編輯器

舉一個簡單例子,新建一個索引,而後查看索引信息:ide

image-20201106201219878

在建立好的索引信息中,能夠看到,mappings 爲空,這個 mappings 中保存的就是映射信息。flex

如今咱們向索引中添加一個文檔,以下:ui

PUT blog/_doc/1
{
  "title":"1111",
  "date":"2020-11-11"
}

文檔添加成功後,就會自動生成 Mappings:

image-20201106201516427

能夠看到,date 字段的類型爲 date,title 的類型有兩個,text 和 keyword。

默認狀況下,文檔中若是新增了字段,mappings 中也會自動新增進來。

有的時候,若是但願新增字段時,可以拋出異常來提醒開發者,這個能夠經過 mappings 中 dynamic 屬性來配置。

dynamic 屬性有三種取值:

  • true,默認即此。自動添加新字段。
  • false,忽略新字段。
  • strict,嚴格模式,發現新字段會拋出異常。

具體配置方式以下,建立索引時指定 mappings(這其實就是靜態映射):

PUT blog
{
  "mappings": {
    "dynamic":"strict",
    "properties": {
      "title":{
        "type""text"
      },
      "age":{
        "type":"long"
      }
    }
  }
}

而後向 blog 中索引中添加數據:

PUT blog/_doc/2
{
  "title":"1111",
  "date":"2020-11-11",
  "age":99
}

在添加的文檔中,多出了一個 date 字段,而該字段沒有預約義,因此這個添加操做就回報錯:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "strict_dynamic_mapping_exception",
        "reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
      }
    ],
    "type" : "strict_dynamic_mapping_exception",
    "reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
  },
  "status" : 400
}

動態映射還有一個日期檢測的問題。

例如新建一個索引,而後添加一個含有日期的文檔,以下:

PUT blog/_doc/1
{
  "remark":"2020-11-11"
}

添加成功後,remark 字段會被推斷是一個日期類型。

image-20201106203240406

此時,remark 字段就沒法存儲其餘類型了。

PUT blog/_doc/1
{
  "remark":"javaboy"
}

此時報錯以下:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'",
    "caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "failed to parse date field [javaboy] with format [strict_date_optional_time||epoch_millis]",
      "caused_by" : {
        "type" : "date_time_parse_exception",
        "reason" : "Failed to parse with all enclosed parsers"
      }
    }
  },
  "status" : 400
}

要解決這個問題,能夠使用靜態映射,即在索引定義時,將 remark 指定爲 text 類型。也能夠關閉日期檢測。

PUT blog
{
  "mappings": {
    "date_detection"false
  }
}

此時日期類型就回當成文原本處理。

靜態映射

略。

9.2 類型推斷

es 中動態映射類型推斷方式以下:

精彩文章推薦:

Spring Boot 要怎麼學?要學哪些東西?要不要先學 SSM?鬆哥說說見解
274 頁 pdf 文檔,Spring Boot 教程也有離線版了


喜歡就點個"在看"唄^_^

本文分享自微信公衆號 - 江南一點雨(a_javaboy)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索