乾貨 | Elasticsearch5.X Mapping萬能模板

0、引言html

在關係型數據庫如Mysql中,設計庫表須要注意的是:sql

1)須要幾個表;數據庫

2)每一個表有哪些字段;json

3)表的主鍵及外鍵的設定——便於有效關聯。數組

表的設計遵照範式約束,考慮表的可擴展性,避免開發後期對錶作大的改動。app

Mysql或者Oracle中,修改數據類型相對比較簡單,經過命令行或者navicat、sqldeveloper等可視化工具直接修改。elasticsearch

即使千萬級別數據量,多等點時間,也能修改好。ide

而在Elasticsearch非關係型數據存儲的搜索引擎中,設計表對應的就是Mapping的設計。工具

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

固然,這也不是絕對的,能夠經過新建索引,而後reindex將原有數據遷移到新索引。

即使如此,仍是建議:索引設計的前期,根據項目的須要設計好字段。如考慮以下的因素:

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

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

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

4) 字段需不須要聚合

.......

這就引伸出本文的內容:

Elasticearch到底支持哪些數據類型?

Elasticsearch如何進行數據選型?

有沒有直接拿來就用的Mapping萬能模板?

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

一、Elasticsearch數據類型有哪些?
乾貨 | Elasticsearch5.X Mapping萬能模板

二、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"

}

}

}

這和Json類型的初衷是一致的。

訪問方式舉例: "manager.name.last": "Smith"。

2.7.3 nested嵌套類型

nested嵌套類型是Object數據類型的特定版本,容許對象數組彼此獨立地進行索引和查詢。

一個例子,天然就明白了:

PUT my_index

{

"mappings": {

"my_type": {

  "properties": {

    "user": {

      "type": "nested"

    }

  }

}

}

}

PUT my_index/my_type/1

{

"group" : "fans",

"user" : [

{

  "first" : "John",

  "last" :  "Smith"

},

{

  "first" : "Alice",

  "last" :  "White"

}

]

}

GET my_index/_search

{

"query": {

"nested": {

  "path": "user",

  "query": {

    "bool": {

      "must": [

        { "match": { "user.first": "Alice" }},

        { "match": { "user.last":  "Smith" }}

      ]

    }

  }

}

}

}

能完成嵌套查詢&檢索,對於非一對一關係的字段適用。

在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的字段其實是一個接受字符串值的整數字段,對它們進行分析,而後對字符串中的令牌數進行索引。

........

三、Elasticsearch萬能Mapping模板

如下模板,已驗證好用。

PUT testinfo_index

{

"mappings": {

"testinfo_type": {

  "properties": {

    "id": {

      "type": "long"

    },

    "title": {

      "type": "keyword"

    },

    "content": {

      "analyzer": "ik_max_word",

      "type": "text",

      "fields": {

        "keyword": {

          "ignore_above": 256,

          "type": "keyword"

        },

        "available": {

          "type": "boolean"

        },

        "review": {

          "type": "nested",

          "properties": {

            "nickname": {

              "type": "text"

            },

            "text": {

              "type": "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"

        }

      }

    }

  }

}

}

}

四、小結

看到這裏,有人可能不服氣的說,哎,又是官網都有的資料!

忽然想起另外一個問題:

高考的時候的每個得分點,課本上不都有嗎?那爲何咱們沒有達到700分以上呢?

既然課本上都有,爲何還要那麼多《黃岡XX衝刺》、《黃岡XX密卷》以及N多複習資料呢?

或許正如大神劉未鵬所說,「重要的事情要營造比較大的時間塊來完成。好比讀一本好書,或者掌握一個重要的知識點,最好不要切得太瑣碎了看,不然看了後面忘了前面,不利於知識的組織和聯繫。」

我作的就是上面的工做。

以上,是說給本身的,也與你們共勉!

參考:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping-types.html

相關文章
相關標籤/搜索