而在Elasticsearch非關系型資料存儲的搜尋引擎中,設計表對應的就是Mapping的設計。
且ES中一旦字段設定後,不能修改。
當然,這也不是絕對的,可以通過建立索引,然後reindex将原有資料遷移到新索引。
即便如此,還是建議:索引設計的前期,根據項目的需要設計好字段。如考慮如下的因素?
1)字段的大小,考慮最大、最小的情況,如某一個字段超過1MB甚至更多;
2)字段需不需要分詞、全文檢索、其他類型的檢索;
3)時間字段類型的設定,時間戳、UTC類型或者字元串類型;
4) 字段需不需要聚合
…….
這就引申出本文的内容,Elasticearch到底支援哪些資料類型?Elasticsearch如何進行資料選型?
有沒有直接拿來就用的Mapping萬能模闆。
以上問題,本文一一透徹解答。
1、Elasticsearch資料類型有哪些?

2、Elasticsearch資料如何選型?
2.1 字元串類型選型
text類型作用:分詞,将大段的文字根據分詞器切分成獨立的詞或者詞組,以便全文檢索。
适用:email内容、某産品的描述等需要分詞全文檢索的字段;
不适用:排序或聚合(Significant Terms 聚合例外)
keyword類型:無需分詞、整段完整精确比對。
适用于:email位址、住址、狀态碼、分類tags。
2.2 數值類型選型
long長整型:一個帶符号的64位整數,最小值為 -263 ,最大值為 263 -1。
integer 整數:一個帶符号的32位整數,最小值為 -231 ,最大值為 231 -1。
short 短整形:一個帶符号的16位整數,最小值為-32,768,最大值為32,767。
byte 位元組型:一個帶符号的8位整數,最小值為-128,最大值為127。
double 雙精度浮點型:雙精度64位IEEE 754浮點數。
float 單精度浮點型:單精度32位IEEE 754浮點數。
half_float半精度浮點型:半精度16位IEEE 754浮點數。
scaled_float:由長度固定的縮放因子支援的浮點數。
以上,根據長度選型即可。
2.3 日期類型選型
{ “date”: “2015-01-01” }
{ “date”: “2015-01-01T12:10:30Z” }
{ “date”: 1420070400001 }
如上,日期類型或者時間戳類型。
參考模闆:
“date”: {
“type”: “date”,
“format”: “yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis”
}
2.4 布爾類型選型
布爾字段接受JSON true和false值,但也可以接受被解釋為true或false的字元串和數字:
false值舉例:
false,“false”,“off”,“no”,“0”,“”(空字元串),0,0.0
true值舉例:
以上false示例的反面,一切非假值。
2.5 二進制類型選型
二進制類型接受二進制值作為Base64編碼字元串。 該字段預設情況下不存儲,不可搜尋:
如: “blob”: “U29tZSBiaW5hcnkgYmxvYg==”
2.6 範圍類型選型
integer_range :整型範圍類型;
float_range :單精度浮點範圍類型;
long_range :長整型範圍類型;
double_range :雙精度範圍類型;
date_range :時間範圍類型;
ip_range :IP範圍類型。
以上,根據類型&範圍需要選型即可。
2.7 數組類型選型
2.7.1 Array數組類型選型
在Elasticsearch中,沒有專門的數組類型。
預設情況下,任何字段都可以包含零個或多個值,但是數組中的所有值必須是相同的資料類型。 例如:
字元串數組: [ “one”, “two”
整數數組:[1,2]
陣列數組:[1,[2,3]],相當于[1,2,3]
一系列對象數組:[{“name”:“Mary”,“age”:12},{“name”:“John”,“age”:10}]
可以了解為單類型擴充多個值的類型。
如果需要根據數組值進行查詢操作,官網建議使用nested嵌套類型。
數組類型:沒有明顯的字段類型設定,任何一個字段的值,都可以被添加0個到多個,當類型一直含有多個值存儲到ES中會自動轉化成數組類型
對于數組類型的資料,是一個數組元素做一個資料單元,如果是分詞的話也隻是會依一個數組元素作為詞源進行分詞,不會是所有的數組元素整合到一起。
在查詢的時候如果數組裡面的元素有一個能夠命中那麼将視為命中,被召回。
2.7.2 Object對象類型
JSON文檔本質上是分層的: 存儲類似json具有層級的資料,文檔可能包含内部對象,而内部對象又可能包含其他内部對象。
PUT my_index/my_type/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
1
2
3
4
5
6
7
8
9
10
11
這和Json類型的初衷是一緻的。
通路方式舉例: “manager.name.last”: “Smith”。
2.7.3 nested嵌套類型
nested 嵌套類型是Object資料類型的特定版本,允許對象數組彼此獨立地進行索引和查詢。
一個例子,自然就明白了:
PUT my_index
"mappings": {
"my_type": {
"properties": {
"user": {
"type": "nested"
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
"first" : "Alice",
"last" : "White"
]
GET my_index/_search
"query": {
"nested": {
"path": "user",
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "Smith" }}
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
能完成嵌套查詢&檢索,對于非一對一關系的字段适用。
在ElasticSearch内部,嵌套的文檔(Nested Documents)被索引為很多獨立的隐藏文檔(separate documents),這些隐藏文檔隻能通過嵌套查詢(Nested Query)通路。每一個嵌套的文檔都是嵌套字段(文檔數組)的一個元素。
嵌套文檔的内部字段之間的關聯被ElasticSearch引擎保留,而嵌套文檔之間是互相獨立的。
預設情況下,每個索引最多建立50個嵌套文檔,可以通過索引設定選項:index.mapping.nested_fields.limit 修改預設的限制。
2.8 IP類型
存儲IPV4或IPV6位址。
如: “ip_addr”: “192.168.1.1”
2.9 completion suggester類型
suggester類型對應 suggester檢索,完成自動補全。
2.10 令牌計數類型
類型為token_count的字段實際上是一個接受字元串值的整數字段,對它們進行分析,然後對字元串中的令牌數進行索引。
……..
3、Elasticsearch萬能Mapping模闆。
以下模闆,已驗證好用。
PUT testinfo_index
"testinfo_type": {
"id": {
"type": "long"
"title": {
"type": "keyword"
"content": {
"analyzer": "ik_max_word",
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"available": {
"type": "boolean"
"review": {
"type": "nested",
"nickname": {
"type": "text"
"text": {
"stars": {
"type": "integer"
"publish_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
"expected_attendees": {
"type": "integer_range"
"ip_addr": {
"type": "ip"
"suggest": {
"type": "completion"
45
46
47
48
49
50
51
52
53
54
55
56
4、小結
看到這裡,有人可能不服氣的說,哎,又是官網都有的資料!
突然想起另一個問題,聯考的時候的每一個得分點,課本上不都有嗎?那為什麼我們沒有達到700分以上呢?
既然課本上都有,為什麼還要那麼多《黃岡XX沖刺》、《黃岡XX密卷》以及N多複習資料呢?
或許正如大神劉未鵬所說,“ 重要的事情要營造比較大的時間塊來完成。比如讀一本好書,或者掌握一個重要的知識點,最好不要切得太瑣碎了看,否則看了後面忘了前面,不利于知識的組織和聯系。 ”
以上,是說給我自己的,也與大家共勉!
參考:
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping-types.html