ElasticSearch 學習筆記 - 6. 映射Mapping

一、概述

映射(Mapping)至關於數據表的表結構。
ElasticSearch中的映射(Mapping)用來定義一個文檔,能夠定義所包含的字段以及字段的類型、分詞器及屬性等等。數據庫

映射能夠分爲動態映射和靜態映射。
(1)動態映射
咱們知道,在關係數據庫中,須要事先建立數據庫,而後在該數據庫實例下建立數據表,而後才能在該數據表中插入數據。
而ElasticSearch中不須要事先定義映射(Mapping),文檔寫入ElasticSearch時,會根據文檔字段自動識別類型,這種機制稱之爲動態映射。數組

(2)靜態映射
固然,在ElasticSearch中也能夠事先定義好映射,包含文檔的各個字段及其類型等,這種方式稱之爲靜態映射。app

二、動態映射實例

(1)新建索引oop

PUT /book

(2)查看空索引設計

GET /book/_mapping

{
  "book": {
    "mappings": {}
  }
}

(3)插入文檔code

PUT book/it/1
{
  "bookId":1,
  "bookName":"Java程序設計",
  "publishDate":"2018-01-12"
}

{
  "_index": "book",
  "_type": "it",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

(4)再次查看映射對象

GET /book/_mapping

{
  "book": {
    "mappings": {
      "it": {
        "properties": {
          "bookId": {
            "type": "long"
          },
          "bookName": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "publishDate": {
            "type": "date"
          }
        }
      }
    }
  }
}

bookId字段推測爲long型,
bookName字段推測爲text類型,
publishDate字段推測爲date類型,
這些推測都是咱們能夠接受的。可見ElasticSearch的動態映射十分強大。索引

三、動態映射規則

JSON數據 自動推測的類型
null 沒有字段被添加
true或false boolean型
小數 float型
數字 long型
日期 date或text
字符串 text
數組 由數組第一個非空值決定
JSON對象 object類型

四、靜態映射

動態映射的自動類型推測功能並非100%正確的,這就須要靜態映射機制。
靜態映射與關係數據庫中建立表語句類型,須要事先指定字段類型。相對於動態映射,靜態映射能夠添加更加詳細字段類型、更精準的配置信息等。文檔

(1)新建映射字符串

PUT books
{
  "mappings":{
    "it": {
       "properties": {
          "bookId": {"type": "long"},
          "bookName": {"type": "text"},
          "publishDate": {"type": "date"}
       }
    }
  }
}

(2)查看映射

GET /books/_mapping

{
  "books": {
    "mappings": {
      "it": {
        "properties": {
          "bookId": {
            "type": "long"
          },
          "bookName": {
            "type": "text"
          },
          "publishDate": {
            "type": "date"
          }
        }
      }
    }
  }
}

(3)插入數據

PUT books/it/1
{
  "bookId":"1",
  "bookName":"Java",
  "publishDate":"2018-01-12"

}

(4)查詢

GET books/it/1

{
  "_index": "books",
  "_type": "it",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "bookId": "1",
    "bookName": "Java",
    "publishDate": "2018-01-12"
  }
}

五、靜態+動態

(1)加入不在靜態映射的字段

PUT books/it/2
{
  "bookId":"2",
  "bookName":"Hadoop",
  "author":"chengyuqiang",
  "publishDate":"2018-01-13"

}

(2)查看索引

GET books/_mapping

{
  "books": {
    "mappings": {
      "it": {
        "properties": {
          "author": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "bookId": {
            "type": "long"
          },
          "bookName": {
            "type": "text"
          },
          "publishDate": {
            "type": "date"
          }
        }
      }
    }
  }
}

經過自動映射添加了新的不存在的字段 author

六、type設計失誤

爲何映射類型被刪除?

ES的索引相似於關係型數據庫中的數據庫,
一個映射類型則至關於關係型數據庫中的一張表。

這是一個錯誤的類比,致使了錯誤的假設。
在一個關係型數據庫中,表之間是相互獨立的。
一個表中的列與另外一個表中同名的列沒有關係。然而在映射類型中卻不是這樣的。

在一個Elasticsearch的索引中,有相同名稱字段的不一樣映射類型在Lucene內部是由同一個字段支持的。

換言之,看下面的這個例子,user 類型中的 user_name字段和tweet類型中的user_name字段其實是被存儲在同一個字段中,並且兩個user_name字段在這兩種映射類型中都有相同的定義(如類型都是 text或者都是date)。

這會致使一些問題,好比,當你但願在一個索引中的兩個映射類型,一個映射類型中的 deleted 字段映射爲一個日期數據類型的字段,而在另外一個映射類型中的deleted字段映射爲一個布爾數據類型的字段,這就會失敗。

最重要的是,在一個索引中存儲那些有不多或沒有相同字段的實體會致使稀疏數據,而且干擾Lucene有效壓縮文檔的能力。

相關文章
相關標籤/搜索