年終了,清理一下自己的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%正確的,這就需要靜態映射機制。靜態映射與數據庫中創建表語句類型,需要實現指定字段類型。相對於動態映射,靜態類型可以添加更加詳細字段類型、更精準的配置信息等。