Elasticsearch7.X Mapping 常見字段類型整理

1、核心數據類型

  • 字符串:text, keyword
  • 數值型:long, integer, short, byte, double, float, half_float, scaled_float
  • 布爾型:boolean
  • 日期型:date, date_nanos
  • 二進制:binary
  • 範圍型:integer_range, float_range, long_range, double_range, date_range

1. 字符串

text

text 類型的字段數據會被分詞,在生成倒排索引之前,字符串會被分詞器分紅一個一個詞項。
text 類型的字段不用於排序,不多用於聚合(termsAggregation除外)。
若是一個字段須要被全文搜索或模糊匹配,好比文章內容、產品描述、新聞內容等,應該使用text類型。html

keyword

keyword 類型的字段內容不會被分詞。
keyword 類型的字段只能經過精確值搜索到,用於過濾、排序、聚合。
適用於索引結構化的字段,好比IP地址、性別和地區等。json

2. 數值型

整數

類型 最小值 最大值 說明
byte -128 127 8 位有符號整數(1個字節),至關於MySQL中有符號的 tinyint
short -32768 32767 16 位有符號整數(2個字節),至關於MySQL中有符號的 smallint
integer -2147483648
(-2^31^)
2147483647
(2^31^-1)
32 位有符號整數(4個字節),至關於MySQL中有符號的 int
long -9223372036854775808)
(-2^63^)
9223372036854775807
(2^63^-1)
64 位有符號整數(8個字節),至關於MySQL中有符號的 bigint

對於整數類型的字段,在知足需求的狀況下,要儘量選擇範圍小的數據類型。好比某個字段的取值最大值不會超過100,那麼選擇byte類型便可。迄今爲止,吉尼斯世界記錄的人類的年齡的最大值爲134歲,對於年齡字段,short足矣。字段的長度越短,索引和搜索的效率越高。數組

小數

類型 最小值 最大值 說明
half_float 2^-24^ 65504 16位半精度浮點數
float 2^-149^ (2-2^-23^)·2^127^ 32位單精度浮點數
double 2^-1074^ (2-2^-52^)·2^1023^ 64位雙精度浮點數
scaled_float 縮放類型浮點數

處理浮點數時,優先考慮使用scaled float類型。scaled float 是經過縮放因子把浮點數變成long類型,好比價格只須要精確到分,price字段的取值爲57.34,設置放大因子爲100,存儲起來就是5734,全部的API都會把price的取值看成浮點數,事實上Elasticsearch底層存儲的是整數類型,由於壓縮整數比壓縮浮點數更加節省存儲空間。數據結構

3. 布爾型

若是一個字段是布爾類型,可接受的值爲 true, false
Elasticsearch 5.4版本之前,能夠接受可被解釋爲 truefalse 的字符串和數字。
5.4版本之後只接受 true, false, "true", "false"app

4. 日期型

date

JSON 沒有日期型數據類型,因此在Elasticsearch中,日期能夠是:elasticsearch

  • 包含格式化日期的字符串,例如"2015-01-01"或者"2015/01/01 12:10:30"
  • 表明時間毫秒數的長整型數字。
  • 表明時間秒數的整數。

Elasticsearch內部會把日期轉換爲 UTC (世界標準時間),並將其存儲爲表明時間毫秒數的長整數。
日期格式能夠自定義,若是沒有指定格式,則使用默認值:ide

"strict_date_optional_time||epoch_millis"

這種狀況下能夠解析下面三種日期格式:優化

"2020-05-01"
"2020-05-01T12:10:30Z"
1591234567890

date_nanos

此數據類型是對日期數據類型的補充。現有的 date 類型能夠存儲毫秒級時間。而 date_nanos 能夠存儲納秒級時間。ui

5. 二進制

binary

二進制數據類型接受Base64編碼字符串的二進制值。字段不以默認方式存儲並且不能搜索。
Base64編碼二進制值不能嵌入換行符\n編碼

6. 範圍型

類型 說明
integer_range 32 位有符號整數的範圍值,-2^31^ ~ 2^31^-1
long_range 62 位有符號整數的範圍值,-2^63^ ~ 2^63^-1
float_range 32位單精度浮點數範圍值
double_range 64位單精度浮點數範圍值
date_range 以64位無符號整數形式表示的日期值範圍
ip_range IPv4IPv6 的範圍值

2、複合數據類型

1. 對象類型

object

用於存儲單個JSON對象。
JSON本質上具備層級關係,文檔包含內部對象,內部對象自己還能夠包含內部對象。

2. 嵌套類型

nested

用於存儲多個JSON對象組成的數組。
nested 類型是 object 類型中的一個特例,可讓對象數組獨立索引和查詢。Lucene沒有內部對象的概念,因此Elasticsearch將對象層次扁平化,轉化成字段名字和值構成的簡單列表。

3、地理位置類型

1. 地理座標類型

geo_point

用於存儲經緯度座標對,可用來
查找必定範圍內的地理點,這個範圍能夠是相對於一箇中心點的固定距離,也能夠是多邊形或者地理散列單元。
經過地理位置或者相對於中心點的距離聚合文檔。
整合距離到文檔的相關性評分中。

用於存儲地理位置信息的經緯度座標對,可用於如下幾種場景:

  • 查找必定範圍內的地理位置。
  • 經過地理位置或者相對中心點的距離來聚合文檔。
  • 把距離因素整合到文檔的評分中。
  • 經過距離對文檔排序。

2. 地理形狀類型

geo_shape

地理形狀數據類型有利於索引和搜索任意地理形狀,例如矩形、三角形或者其餘多邊形。不管是數據被索引仍是在查詢執行的過程當中,均可以使用地理形狀數據類型在地理點的基礎上包含地理形狀。
Elasticsearch 使用 GeoJSON 格式來表示地理形狀。
GeoJSON 是一種對各類地理數據結構進行編碼的格式,對象能夠表示幾何、特徵或者特徵集合,支持點、線、面、多點、多線、多面等幾何類型。
GeoJSON 裏的特徵包含一個幾何對象和其餘屬性,特徵集合表示一系列特徵。
想了解更多關於 GeoJSON 的資料可參考《GeoJSON格式規範說明》

4、特殊類型

IP

IP地址類型,存儲 IPv4 和 IPv6 地址

Completion datatype

completion 提供自動補全建議

Token count

token_count 用於統計字符串分詞後的詞項個數,本質上是一個整數型字段。
例如:映射中指定 name 爲 text 類型,增長 name_length 字段用於統計分詞後詞項的長度,類型爲 token_count,分詞器爲標準分詞器。

mapper-murmur3

murmur3 在索引時計算值的哈希值並將它們存儲在索引中

mapper-annotated-text

annotated-text 索引包含特殊標記的文本(一般用於標識命名實體)

Percolator

接受來自 query-dsl 的查詢

Join

爲同一索引中的文檔定義父/子關係

Rank feature

Rank features

排名功能,記錄數字特性以提升查詢時的命中率

Dense vector

密集向量,記錄浮點值的密集向量

Sparse vector

稀疏向量,記錄浮點值的稀疏向量

Search-as-you-type

按類型搜索,相似文本的字段,爲查詢進行優化,以實現按類型完成

Alias

別名,定義現有字段的別名

Flattened

容許將整個JSON對象做爲單個字段編入索引。

Shape

shape for arbitrary cartesian geometries.

Histogram

histogram for pre-aggregated numerical values for percentiles aggregations.

5、數組類型

數組類型不須要專門指定數組元素的類型,任何字段類型均可以包含在數組內,可是數組中的全部值必須具備相同的數據類型。

  • 字符型數組: ["one", "two"]
  • 整型數組:[1, 2]
  • 數組型數組:[1, [2, 3]] 等同於 [1, 2, 3]
  • 對象數組:[{"name": "Mary", "age": 12}, {"name": "John", "age": 10}]
參考文獻:

官方文檔v7.6:字段數據類型《從Lucene到Elasticsearch全文檢索實戰》《Elasticsearch技術解析與實戰》

相關文章
相關標籤/搜索