string類型在ElasticSearch 舊版本中使用較多,從ElasticSearch 5.x開始再也不支持string,由text和keyword類型替代。html
當一個字段是要被全文搜索的,好比Email內容、產品描述,應該使用text類型。設置text類型之後,字段內容會被分析,在生成倒排索引之前,字符串會被分析器分紅一個一個詞項。text類型的字段不用於排序,不多用於聚合。數組
keyword類型適用於索引結構化的字段,好比email地址、主機名、狀態碼和標籤。若是字段須要進行過濾(好比查找已發佈博客中status屬性爲published的文章)、排序、聚合。keyword類型的字段只能經過精確值搜索到。app
類型 | 取值範圍 |
---|---|
byte | -128~127 |
short | -32768~32767 |
integer | -231~231-1 |
long | -263~263-1 |
在知足需求的狀況下,儘量選擇範圍小的數據類型。好比,某個字段的取值最大值不會超過100,那麼選擇byte類型便可。迄今爲止吉尼斯記錄的人類的年齡的最大值爲134歲,對於年齡字段,short足矣。字段的長度越短,索引和搜索的效率越高。elasticsearch
類型 | 取值範圍 |
---|---|
doule | 64位雙精度IEEE 754浮點類型 |
float | 32位單精度IEEE 754浮點類型 |
half_float | 16位半精度IEEE 754浮點類型 |
scaled_float | 縮放類型的的浮點數 |
對於float、half_float和scaled_float,-0.0和+0.0是不一樣的值,使用term查詢查找-0.0不會匹配+0.0,一樣range查詢中上邊界是-0.0不會匹配+0.0,下邊界是+0.0不會匹配-0.0。ide
其中scaled_float,好比價格只須要精確到分,price爲57.34的字段縮放因子爲100,存起來就是5734
優先考慮使用帶縮放因子的scaled_float浮點類型。測試
日期類型表示格式能夠是如下幾種:ui
(1)日期格式的字符串,好比 「2018-01-13」 或 「2018-01-13 12:10:30」
(2)long類型的毫秒數( milliseconds-since-the-epoch,epoch就是指UNIX誕生的UTC時間1970年1月1日0時0分0秒)
(3)integer的秒數(seconds-since-the-epoch)spa
ElasticSearch 內部會將日期數據轉換爲UTC,並存儲爲milliseconds-since-the-epoch的long型整數。日誌
定義日期類型和日誌格式:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html#strict-date-timecode
邏輯類型(布爾類型)能夠接受true/false/」true」/」false」值
PUT information { "mappings": { "record": { "properties": { "is_delete": { "type": "boolean" } } } } }
新建文檔:
PUT information/record/1 { "is_delete": "true" } PUT information/record/2 { "is_delete":false }
查詢文檔;
GET information/record/_mget { "ids":[1,2] }
查詢結果:
{ "docs": [ { "_index": "information", "_type": "record", "_id": "1", "_version": 1, "found": true, "_source": { "is_delete": "true" } }, { "_index": "information", "_type": "record", "_id": "2", "_version": 1, "found": true, "_source": { "is_delete": false } } ] }
二進制字段是指用base64來表示索引中存儲的二進制數據,可用來存儲二進制形式的數據,例如圖像。默認狀況下,該類型的字段只存儲不索引。二進制類型只支持index_name屬性。
在ElasticSearch中,沒有專門的數組(Array)數據類型,可是,在默認狀況下,任意一個字段均可以包含0或多個值,這意味着每一個字段默認都是數組類型,只不過,數組類型的各個元素值的數據類型必須相同。在ElasticSearch中,數組是開箱即用的(out of box),不須要進行任何配置,就能夠直接使用。
在同一個數組中,數組元素的數據類型是相同的,ElasticSearch不支持元素爲多個數據類型:[ 10, 「some string」 ],經常使用的數組類型是:
(1)字符數組: [ 「one」, 「two」 ]
(2)整數數組: productid:[ 1, 2 ]
(3)對象(文檔)數組: 「user」:[ { 「name」: 「Mary」, 「age」: 12 }, { 「name」: 「John」, 「age」: 10 }],ElasticSearch內部把對象數組展開爲 {「user.name」: [「Mary」, 「John」], 「user.age」: [12,10]}
JSON天生具備層級關係,文檔會包含嵌套的對象
PUT information/record/1 { "title": "這是一個測試", "event": { "name": "sacn掃描", "times": 20 } }
建立文檔包含title和event兩個屬性,其中event爲對象類型也包含兩個屬性name和times。
{ "_index": "information", "_type": "record", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 2, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
查詢mapping結構:
{ "information": { "mappings": { "record": { "properties": { "event": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "times": { "type": "long" } } }, "title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
ip類型的字段用於存儲IPv4或者IPv6的地址
PUT information { "mappings": { "record": { "properties": { "attack_ip": { "type": "ip" } } } } }
新增文檔:
PUT information/record/1 { "attack_ip":"10.118.213.192" }
查詢文檔:
GET information/record/1
查詢結果:
{ "_index": "information", "_type": "record", "_id": "1", "_version": 1, "found": true, "_source": { "attack_ip": "10.118.213.192" } }