天天看點

幹貨 | Elasticsearch5.X Mapping萬能模闆

而在Elasticsearch非關系型資料存儲的搜尋引擎中,設計表對應的就是Mapping的設計。

且ES中一旦字段設定後,不能修改。

當然,這也不是絕對的,可以通過建立索引,然後reindex将原有資料遷移到新索引。

即便如此,還是建議:索引設計的前期,根據項目的需要設計好字段。如考慮如下的因素?

1)字段的大小,考慮最大、最小的情況,如某一個字段超過1MB甚至更多;

2)字段需不需要分詞、全文檢索、其他類型的檢索;

3)時間字段類型的設定,時間戳、UTC類型或者字元串類型;

4) 字段需不需要聚合

…….

這就引申出本文的内容,Elasticearch到底支援哪些資料類型?Elasticsearch如何進行資料選型?

有沒有直接拿來就用的Mapping萬能模闆。

以上問題,本文一一透徹解答。

1、Elasticsearch資料類型有哪些?

幹貨 | Elasticsearch5.X Mapping萬能模闆

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