核心數(shù)據(jù)類型
字符串類型
- string(被取代了):這是一個已經(jīng)過期的字符串類型嘀掸。在 es5 之前,用這個來描述字符串规惰,現(xiàn)在的話睬塌,它已經(jīng)被 text 和 keyword 替代了
- text:如果一個字段是要被全文檢索的,比如說博客內(nèi)容歇万、產(chǎn)品描述揩晴,那么可以使用 text。用了 text 之后贪磺,字段內(nèi)容會被分析硫兰,在生成倒排索引之前,字符串會被分詞器分成一個個詞項(xiàng)寒锚。text 類型的字段不用于排序劫映,很少用于聚合,這種字符串也被稱為 analyzed 字段
例如:"Elasticsearch數(shù)據(jù)類型系列" 會拆分為
1. Elasticsearch 2. 數(shù)據(jù) 3. 類型 4. 系列 幾個詞條存儲
搜索的時候無法完整搜索了 `arch數(shù)據(jù)` 這個內(nèi)容了
- keyword:這種類型適用于結(jié)構(gòu)化的字段刹前,不需要進(jìn)行分詞泳赋,可以被用來檢索過濾、排序和聚合喇喉。例如標(biāo)簽祖今、email 地址、網(wǎng)頁地址、手機(jī)號碼等等千诬,這種類型的字段可以用作過濾撒踪、排序、聚合等大渤。這種字符串也稱之為 not-analyzed 字段
例如:"Elasticsearch數(shù)據(jù)類型系列" 這句話不會分詞完整的索引存儲
數(shù)字型
long, integer, short, byte, double, float 等
日期型
date
由于 JSON 中沒有日期類型制妄,所以 es 中的日期類型形式就比較多樣
例如
PUT product/_doc/1
{
"date":"2020-11-11"
}
PUT product/_doc/2
{
"date":"2020-11-11T11:11:11Z"
}
PUT product/_doc/3
{
"date":"1604672099958"
}
上面三個文檔中的日期都可以被解析,內(nèi)部存儲的是毫秒計(jì)時的長整型數(shù)
es 內(nèi)部將時間轉(zhuǎn)為 UTC泵三,然后將時間按照 millseconds-since-the-epoch 的長整型來存儲
布爾型
boolean
JSON 中的 “true”耕捞、“false”、true烫幕、false 都可以
二進(jìn)制類型
binary
二進(jìn)制接受的是 base64 編碼的字符串俺抽,默認(rèn)不存儲,也不可搜索
范圍類型
- integer_range
- float_range
- long_range
- double_range
- date_range
- ip_range
指定范圍的時较曼,可以使用 gt磷斧、gte、lt捷犹、lte弛饭。
復(fù)合(雜)數(shù)據(jù)類型
數(shù)組類型
數(shù)組中的元素必須是同一種類型,添加數(shù)組時萍歉,數(shù)組中的第一個元素決定了整個數(shù)組的類型
數(shù)組類型(Array datatype):數(shù)組類型不需要專門指定數(shù)組元素的type侣颂,例如:
字符型數(shù)組: [ "one", "two" ]
整型數(shù)組:[ 1, 2 ]
數(shù)組型數(shù)組:[ 1, [ 2, 3 ]] 等價于[ 1, 2, 3 ]
對象數(shù)組:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
對象類型(Object datatype):_ object _ 用于單個JSON對象;例如:
PUT product/_doc/2
{
"date":"2020-11-11T11:11:11Z",
"ext_info":{
"address":"China"
}
}
嵌套類型(Nested datatype):_ nested _ 用于JSON數(shù)組枪孩;例如要存儲下面的文檔:
{
"user":[
{
"first":"Zhang",
"last":"san"
},
{
"first":"Li",
"last":"si"
}
]
}
地理位置類型
使用場景:
- 查找某一個范圍內(nèi)的地理位置
- 通過地理位置或者相對中心點(diǎn)的距離來聚合文檔
- 把距離整個到文檔的評分中
- 通過距離對文檔進(jìn)行排序
分為兩大類:地理坐標(biāo)憔晒,地理形狀
- 地理坐標(biāo)類型(Geo-point datatype):geo_point 用于經(jīng)緯度坐標(biāo);
geo_point 就是一個坐標(biāo)點(diǎn)蔑舞,定義方式如下:
PUT people
{
"mappings": {
"properties": {
"location":{
"type": "geo_point"
}
}
}
}
創(chuàng)建時指定字段類型拒担,存儲的時候,有四種方式:
中山公園附近隨便選了一個坐標(biāo) 121.41,31.21
PUT people/_doc/1
{
"location":{
"lat": 121.41,
"lon": 31.21
}
}
PUT people/_doc/2
{
"location":"121.41,31.21"
}
PUT people/_doc/3
{
"location":"wtw3dc8" // 這個為經(jīng)緯度哈希值
}
PUT people/_doc/4
{
"location":[31.21,121.41] // 使用數(shù)組描述攻询,先經(jīng)度后緯度
}
推薦一個在線經(jīng)緯度轉(zhuǎn)哈希工具 http://www.geohash.cn/
-
地理形狀類型(Geo-Shape datatype):geo_shape 用于類似于多邊形的復(fù)雜形狀从撼;
指定 geo_shape 類型:
PUT people
{
"mappings": {
"properties": {
"location":{
"type": "geo_shape"
}
}
}
}
添加文檔時需要指定具體的類型:
PUT people/_doc/1
{
"location":{
"type":"point",
"coordinates": [108.94,34.27]
}
}
如果是 linestring,如下:
PUT people/_doc/2
{
"location":{
"type":"linestring",
"coordinates": [[108.94,34.27],[100,33]]
}
}
特定類型
- IPv4 類型(IPv4 datatype):_ ip _ 用于IPv4 地址蜕窿;
存儲 IP 地址谋逻,類型是 ip:
PUT blog
{
"mappings": {
"properties": {
"address":{
"type": "ip"
}
}
}
}
添加文檔:
PUT blog/_doc/1
{
"address":"192.168.91.1"
}
搜索文檔:
GET blog/_search
{
"query": {
"term": {
"address": "192.168.0.0/16"
}
}
}
Completion 類型(Completion datatype):_ completion _提供自動補(bǔ)全建議;
Token count 類型(Token count datatype):_ token_count _ 用于統(tǒng)計(jì)做了標(biāo)記的字段的index數(shù)目桐经,該值會一直增加毁兆,不會因?yàn)檫^濾條件而減少
統(tǒng)計(jì)字符串分詞后的詞項(xiàng)個數(shù)。
PUT blog
{
"mappings": {
"properties": {
"title":{
"type": "text",
"fields": {
"length":{
"type":"token_count",
"analyzer":"standard"
}
}
}
}
}
}
相當(dāng)于新增了 title.length 字段用來統(tǒng)計(jì)分詞后詞項(xiàng)的個數(shù)
添加文檔:
PUT blog/_doc/1
{
"title":"zhang san"
}
可以通過 token_count 去查詢:
GET blog/_search
{
"query": {
"term": {
"title.length": 2
}
}
}
類型:通過插件阴挣,可以通過 _ murmur3 _ 來計(jì)算 index 的 hash 值气堕;
附加類型(Attachment datatype):采用 mapper-attachments
插件,可支持_ attachments _ 索引,例如 Microsoft Office 格式茎芭,Open Document 格式揖膜,ePub, HTML 等