無論是關系型數據庫還是非關系型數據庫,乃至elasticsearch這種事實上承擔着一定儲存作用的搜索引擎,數據類型都是非常重要而基礎的概念。本文基於elasticsearch 5.x版本。
核心數據類型(Core datatypes)
string
text:全文檢索需要分詞的類型。
keyword:精確值。合適分組排序。
Caused by: NotSerializableExceptionWrapper[: Fielddata is disabled on text fields by default. Set fielddata=true on [gid] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [gid] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.];
以上異常就是由於對text類型的字段進行排序造成的。
數字類型 Numeric datatypes
long 帶符號的64位整數,最小值為-263,最大值為263-1。
integer 一個帶32位整數,最小值為-231,最大值為231-1。
short
byte
double
float
half_float 半精度16位IEEE 754浮點數。
scaled_float 支持固定的縮放因子的浮點數。
對於數字類型,熟悉關系型數據庫的應該都不難理解 。其中,獨特的是half_float和scaled_float兩個類型。
官方的解釋:
double,float和half_float類型認為-0.0和+0.0是不同的值。因此,在-0.0上執行術語查詢將不匹配+0.0,反之亦然。對於范圍查詢也是如此:如果上限為-0.0,則+0.0將不匹配,如果下限為+0.0,則-0.0將不匹配。
對於浮點類型,使用縮放因子將浮點數據存儲到整數中通常更為有效,這是縮放縮放類型在引擎蓋下執行的。比如價格,12.34元,縮放因子為100,那么存儲為1234。這是一個整數。這大大有助於節省磁盤空間,因為整數比浮點更容易壓縮。Date datatype
日期類型 Date datatype
date
JSON中沒有日期類型,所以在ELasticsearch中,日期類型可以是以下幾種:
日期格式的字符串:e.g. “2015-01-01” or “2015/01/01 12:10:30”.
long類型的毫秒數( milliseconds-since-the-epoch)
integer的秒數(seconds-since-the-epoch)
日期格式可以自定義,如果沒有自定義,默認格式如下:
"strict_date_optional_time||epoch_millis"
布爾類型 Boolean datatype
boolean
true和false。但也可以接受自定義值。
范圍類型 Range datatypes
integer_range
float_range
long_range
double_range
date_range
ip_range
這個類型的字段可以通過兩個字段來界定上下范圍。
復雜數據類型 Complex datatypes
數組類型 Array datatype
數組: ["one","two"],[1,2]
嵌套數組: [1, [2,3]] 相當於 [1,2,3]
對象數組: [{ "name": "Mary", "age": 12 },{ "name": "John", "age": 10 }]
動態添加字段時,數組中的第一個值決定字段類型。所有后續值必須是相同的數據類型,或至少可以將后續值強制轉換為相同的數據類型。
不支持使用數據類型混合的數組:[10,“some string”]
數組可能包含空值,它們被配置的null_value替換或完全跳過。空數組[]被視為缺少的字段 - 沒有值的字段。
對象類型 Object datatype
包含一個json對象。其中可以有個子節點。子節點可以是json對象。

在內部,該文檔被索引為一個簡單的,平均的鍵值對列表,如下所示:

真正儲存如下:

嵌套對象類型 Nested datatype
同對象類型,不過它可以是一個json數組。
地理數據類型
經緯度類型 Geo-point datatype
復雜形狀數據類型 Geo-Shape datatype
geo_shape數據類型便於對任意地理形狀進行索引和搜索,如矩形和多邊形。當被索引的數據或執行的查詢包含除了點之外的形狀時,應該使用它。
您可以使用geo_shape Query查詢使用此類型的文檔。
專門數據類型 Specialised datatypes
IP類型 IP datatype
略。