ElasticSearch 筆記-映射

年終了,清理一下自己的OneNote,把筆記遷移到博客上來。

什麼是映射

數據庫建表的時候,我們DDL依據一般都會指定每個字段的存儲類型,例如:varchar、int、datetime等,目的很明確,就是更精確的存儲數據,防止數據類型格式混亂,在Elasticsearch中也是這樣,創建愛你索引的時候一般也需要指定索引的字段類型,這種方式稱爲映射(Mapping)。

字段類型

映射針對的是文檔的字段,數據庫中有varchar、int、datetime等數據類型,那麼ElasticSearch中又有哪些字段類型,每個字段類型都代表什麼意思呢?
Elasticsearch支持文檔字段有多種不同的數據類型,根據官方文檔分類,可以劃分以下幾個類別:核心數據類型、複雜數據類型、Geo(地址)數據類型、專用數據類型和多字段。

核心數據類型

  • 字符串類型:主要包括text和keyword
  • 數字類型:主要包括long、integer、short、byte、double、float、half_float、scaled_float
  • 日期類型
  • 布爾類型
  • 二進制類型
  • 範圍數據類型:integer_range、float_range、long_range、double_range、date_range

多字段

有時候單純的一個字段類型滿足不了我們複雜的需求,爲了不同的目的,以不同的方式索引同一個字段通常很有。多字段也是ES的一種數據類型,只不過結合了更多的功能。
例如,對於字符串字段,我們既可以將他映射爲text類型用於全文搜索,亦可以將它映射爲keyword類型用於排序或聚合,或者,還可以使用標準分詞器、英語分詞器和其他語言分詞器索引文本字段。
大多數數據類型都通過fields參數支持多字段。例如對於城市名稱的多字段映射,可以這樣寫:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "cityName": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}

映射

映射是定義一個文檔及其包含的字段如何存儲和索引的過程。例如,使用映射來定義:

  • 應將那些字符串字段視爲全文字段;
  • 那些字段包含數字,日期或地理文字;
  • 是否應將文檔中所有字段的值索引到catch-all_all字段中;
  • 日期值的格式;
  • 自定義規則以控制動態添加字段的映射。

其實在ElasticSearch中可以不需要實現定義映射(Mapping),文檔寫入Elasticsearch是,會根據文檔字段自動識別類型,但是通過這種自動識別的字段不是很精確,對於一些複雜的需要分詞的就不合適了。

根據是否自動識別映射類型,我們可以將映射分爲動態映射和靜態映射。

  • 動態映射
    即不實現指定映射類型(Mapping)、文檔寫入Elasticsearch是,ES會根據文檔自動識別類型,這種機制稱爲動態映射。
    比如:
PUT /library/book/1
{
  "bookId":1,
  "bookName":"Java核心技術 卷I",
  "publishDate":"2014-03-12"
}

我們可以通過 GET /library/_mapping 的到映射信息:

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

可以看到我們沒有創建索引是,Elasticsearch自動根據文檔爲我們映射了字段類型,bookid的映射類型爲long、bookName的映射爲多字段類型:text和keyword,publishDate的映射類型爲date,可以看到ES的動態映射功能還是很強大的。
默認情況下,當文檔中找到以前未見到過的字段,Elasticsearch會自動將這個新字段添加到類型映射中。我們可以在文檔和object級別禁用這項功能,具體操作方式就是通過dynamic參數這隻爲false或strict,設置爲false是忽略新字段,而設置爲strict是如果遇到未知字段,就拋出異常。

  • 靜態映射
    即認爲實現定義好映射,包含文檔的多個字段及其類型等,這種方式稱爲靜態映射,亦可稱爲顯式映射。
    靜態映射的自動類型推測功能並不是100%正確的,這就需要靜態映射機制。靜態映射與數據庫中創建表語句類型,需要實現指定字段類型。相對於動態映射,靜態類型可以添加更加詳細字段類型、更精準的配置信息等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章