1. 前言
Mapping(映射)用來(lái)定義文檔包含的字段名裆操、字段數(shù)據(jù)類型以及文檔如何存儲(chǔ)和索引這些字段的規(guī)則,例如妥曲,使用映射來(lái)定義:
- 哪些字符串字段應(yīng)該作為全文字段(text)處理堡称。
- 哪些字段包含數(shù)字、日期或地理位置钓株。
- 日期值的格式。
- 控制動(dòng)態(tài)添加字段的映射的自定義規(guī)則陌僵。
例如轴合,文章的索引Mapping定義如下:
Mapping既可以是創(chuàng)建索引時(shí)使用,也可以預(yù)先顯式定義碗短。
映射字段種類包括有:
- 元數(shù)據(jù)字段(Metadata fields)
元數(shù)據(jù)字段用于定制如何處理與文檔相關(guān)的元數(shù)據(jù)受葛。例如,元數(shù)據(jù)字段包括文檔的_index豪椿、_id和_source字段奔坟。 - 定義的字段或?qū)傩裕‵ields or properties)
定義文檔中包括哪些字段或?qū)傩粤斜怼?/li>
2. 字段數(shù)據(jù)類型
索引文檔中的每個(gè)字段都有一個(gè)數(shù)據(jù)類型。既可以是一種簡(jiǎn)單的類型(比如text搭盾、keyword、date婉支、long等)鸯隅,也可以是JSON分層特性的類型或者特殊類型(比如object、nested向挖、geo_point等)蝌以。
同一個(gè)字段如果使用不同的數(shù)據(jù)類型,那么它的意義也是不同的何之,例如跟畅,字符串既可以定義為text字段類型進(jìn)行分析索引,以便進(jìn)行全文搜索溶推,也可以定義為keyword字段類型保持原樣進(jìn)行索引徊件,以便進(jìn)行排序或聚合奸攻。
字段類型按照家族系列分組,同一系列的類型支持相同的搜索功能虱痕,只是可能在性能特性或存儲(chǔ)空間上有所不同睹耐。下面介紹幾種字段類型。
2.1 普通類型
Binary
- 描述:二進(jìn)制類型部翘,類型值binary硝训。接收一個(gè)Base64編碼的二進(jìn)制值。該類型定義的字段不可搜索新思,且默認(rèn)不存儲(chǔ)窖梁。
- 操作示例如下:
PUT my-index-000001
{
"mappings": {
"properties": {
"name": {
"type": "text",
"store": false
},
"blob": {
"type": "binary"
}
}
}
}
PUT my-index-000001/_doc/1
{
"name": "Some binary blob",
"blob": "U29tZSBiaW5hcnkgYmxvYg=="
}
GET my-index-000001/_doc/1
{
}
- 支持的類型參數(shù):doc_values(默認(rèn)false)、store(默認(rèn)false)夹囚。
Boolean
- 描述:布爾類型纵刘,類型值boolean。接受true崔兴、false值彰导,也支持字符串"true"、"false" 或空字符串""敲茄,空字符串表示false位谋。在聚合操作時(shí),返回boolean類型使用1和0作為key堰燎,使用字符串“true”和“false”作為key_as_string掏父。
- 操作示例如下:
(1)創(chuàng)建索引及索引數(shù)據(jù)
PUT my-index-000002
{"mappings":{"properties":{"is_published":{"type":"boolean"}}}}
POST my-index-000002/_doc/1
{"is_published":true}
POST my-index-000002/_doc/2
{"is_published":"false"}
(2)按照字段is_published聚合:
GET my-index-000002/_search
{"aggs":{"publish_state":{"terms":{"field":"is_published"}}}}
聚合結(jié)果片段如下:
"aggregations" : {
"publish_state" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 0,
"key_as_string" : "false",
"doc_count" : 1
},
{
"key" : 1,
"key_as_string" : "true",
"doc_count" : 1
}
]
}
}
- 支持的類型參數(shù):boost(默認(rèn)1.0)、doc_values(默認(rèn)true)秆剪、index(默認(rèn)true)赊淑、null_value(默認(rèn)null)、store(默認(rèn)false)仅讽、meta陶缺,所以在默認(rèn)情況下,該類型字段支持可搜索洁灵,不可存儲(chǔ)饱岸。
Keyword
- 描述:關(guān)鍵字類型家族,類型值包括keyword徽千、 constant_keyword以及 wildcard苫费。用于索引結(jié)構(gòu)化的內(nèi)容,比如主機(jī)名双抽、狀態(tài)代碼百框、郵政編碼,通常作用于過(guò)濾查找牍汹、排序和聚合操作铐维,但是只能通過(guò)確切的值進(jìn)行搜索柬泽,返回字段值完全匹配的文檔數(shù)據(jù)。
- 操作示例如下:
PUT my-index-000003
{"mappings":{"properties":{"tags":{"type":"keyword"}}}}
POST my-index-000003/_doc/1
{"tags":"big ball"}
POST my-index-000003/_doc/2
{"tags":"small ball"}
## 通過(guò)確切的值搜索
GET my-index-000003/_search
{"query":{"match":{"tags":"small ball"}}}
- 支持的類型參數(shù):boost(默認(rèn)1.0)方椎、doc_values(默認(rèn)true)聂抢、eager_global_ordinals(默認(rèn)false)、fields棠众、ignore_above琳疏、 index(默認(rèn)true)、index_options闸拿、norms(默認(rèn)false)空盼、null_value(默認(rèn)null)、similarity(默認(rèn)BM25)新荤、normalizer(默認(rèn)null)揽趾、store(默認(rèn)false)、meta苛骨,所以在默認(rèn)情況下篱瞎,該類型字段支持可搜索,不可存儲(chǔ)痒芝。
Numbers
- 描述:數(shù)字類型家族俐筋,類型值包括long、 integer严衬、short澄者、byte、double请琳、float粱挡、half_float、scale_float俄精。對(duì)于數(shù)字類型的選擇時(shí)询筏,根據(jù)滿足實(shí)際情況選擇最小的類型,這樣對(duì)于索引和搜索更有效竖慧,但是es存儲(chǔ)是基于存儲(chǔ)的實(shí)際值進(jìn)行優(yōu)化的屈留,因此選擇一種類型不影響存儲(chǔ)要求。
- 操作示例如下:
PUT my-index-000004
{"mappings":{"properties":{"number_of_bytes":{"type":"integer"},"time_in_seconds":{"type":"float"},"price":{"type":"scaled_float","scaling_factor":100}}}}
POST my-index-000004/_doc/1
{"number_of_bytes":100,"time_in_seconds":1,"scaling_factor":100}
GET my-index-000004/_search
{}
- 支持的類型參數(shù):coerce(默認(rèn)true)测蘑、boost(默認(rèn)1.0)、doc_values(默認(rèn)true)康二、ignore_malformed(默認(rèn)false)碳胳、
index(默認(rèn)true)、null_value(默認(rèn)null)沫勿、store(默認(rèn)false)挨约、meta味混,所以在默認(rèn)情況下,該類型字段支持可搜索诫惭,不可存儲(chǔ)翁锡。
Dates
- 描述:日期類型家族,類型值包括date夕土、date_nanos馆衔。JSON沒(méi)有日期數(shù)據(jù)類型,所以在Elasticsearch的日期可以是:
(1)包含格式化日期的字符串怨绣,例如角溃,“2015-01-01”或“2015/01/01 12:10:30”。
(2)long數(shù)字值milliseconds-since-the-epoch篮撑。
(3)integer數(shù)字值seconds-since-the-epoch减细。
注:milliseconds-since-the-epoch 和 seconds-since-the-epoch 必須是非負(fù)數(shù)。格式化日期表示從1970以后的日期赢笨。 - 操作示例如下:
PUT my-index-000005
{"mappings":{"properties":{"date":{"type":"date","store":true}}}}
PUT my-index-000005/_doc/1
{"date":"2015-01-01"}
PUT my-index-000005/_doc/2
{ "date": "2015-01-01T12:10:30Z" }
PUT my-index-000005/_doc/3
{"date":1420070400001}
GET my-index-000005/_search
{"sort":{"date":"asc"}}
- 在es內(nèi)部未蝌,如果指定了時(shí)區(qū),字符串形式日期被轉(zhuǎn)換為UTC茧妒,進(jìn)一步轉(zhuǎn)換為milliseconds-since-the-epoch進(jìn)行存儲(chǔ)萧吠;對(duì)于字符串形式日期的查詢,在內(nèi)部也是先轉(zhuǎn)換為long數(shù)字值進(jìn)行范圍查詢嘶伟,對(duì)于查詢結(jié)果和聚合的響應(yīng)怎憋,則將long數(shù)字轉(zhuǎn)換回原來(lái)字符串形式返回。
- 日期格式可以自定義九昧,如果沒(méi)有指定格式绊袋,使用默認(rèn)格式:
// 必須日期+可選時(shí)間 或者 時(shí)間毫秒數(shù)
"strict_date_optional_time||epoch_millis"
- 多個(gè)日期格式支持。通過(guò)使用||作為分隔符來(lái)分隔多個(gè)格式铸鹰。索引時(shí)將依次嘗試每種格式癌别,直到找到匹配的格式,操作示例如下:
PUT my-index-000005_01
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
- 支持的類型參數(shù):boost(默認(rèn)1.0)蹋笼、doc_values(默認(rèn)true)展姐、format(默認(rèn)strict_date_optional_time||epoch_millis)、locale剖毯、ignore_malformed(默認(rèn)false)圾笨、index(默認(rèn)true)、null_value(默認(rèn)null)逊谋、store(默認(rèn)false)擂达、meta,所以在默認(rèn)情況下胶滋,該類型字段支持可搜索板鬓,不可存儲(chǔ)悲敷。
- date_nanos 類型和 date 類型之間有一個(gè)重要區(qū)別,date數(shù)據(jù)類型以毫秒的分辨率存儲(chǔ)日期俭令。date_nanos數(shù)據(jù)類型以納秒分辨率存儲(chǔ)日期后德,這限制了date_nanos的日期范圍大約從1970年到2262。
Alias
- 描述:字段別名類型抄腔,類型值alias瓢湃。別名映射為索引中的字段定義了一個(gè)替代名稱。在搜索請(qǐng)求中別名可以代替目標(biāo)字段妓柜。
- 操作示例如下:
PUT my-index-000006
{
"mappings": {
"properties": {
"distance": {
"type": "long"
},
"route_length_miles": {
"type": "alias",
"path": "distance"
}
}
}
}
PUT my-index-000006/_doc/1
{"distance":50}
PUT my-index-000006/_doc/2
{"distance":10}
GET my-index-000006/_search
{"query":{"range":{"route_length_miles":{"gte":39}}}}
注:path參數(shù)值必須對(duì)應(yīng)目標(biāo)字段的全路徑箱季,包括目錄字段的父級(jí)字段,如object1.object2.field棍掐。
- 字段別名的目標(biāo)字段有一些限制:
(1)目標(biāo)必須是一個(gè)具體字段藏雏,不能是一個(gè)對(duì)象或字段別名。
(2)創(chuàng)建字段別名時(shí)作煌,目標(biāo)字段必須存在掘殴。
(3)如果定義了嵌套對(duì)象,則字段別名必須具有與其目標(biāo)相同的嵌套范圍粟誓。
(4)字段別名只能有一個(gè)目標(biāo)奏寨。
2.2 對(duì)象和關(guān)系型類型
Object
- 描述:JSON對(duì)象類型,可以嵌套JSON對(duì)象鹰服。不需要顯式設(shè)置類型值為object病瞳,因?yàn)檫@是系統(tǒng)默認(rèn)值。
- 操作示例如下:
PUT my-index-000007
{
"mappings": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": {
"type": "integer"
},
"name": {
"properties": {
"first": {
"type": "text"
},
"last": {
"type": "text"
}
}
}
}
}
}
}
}
數(shù)據(jù)索引時(shí)悲酷,支持key-value鍵值對(duì)格式的數(shù)據(jù)套菜。
PUT my-index-000007/_doc/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
PUT my-index-000007/_doc/2
{
"region": "China",
"manager.age": 100,
"manager.name.first": "SanFeng",
"manager.name.last": "Zhang"
}
- 支持的類型參數(shù):
(1)dynamic:是否應(yīng)該向現(xiàn)有對(duì)象動(dòng)態(tài)添加新屬性。接受true(默認(rèn)值)设易、false和strict逗柴。
(2)enabled:對(duì)象字段的JSON值應(yīng)該被解析和索引(true,默認(rèn))還是完全忽略(false)顿肺。
(3)properties:對(duì)象中的字段戏溺,可以是任何數(shù)據(jù)類型,包括object屠尊】趸觯可以向現(xiàn)有對(duì)象添加新屬性。
Flattened
- 描述:扁平JSON對(duì)象類型讼昆,類型值flattened肋僧,將整個(gè)JSON對(duì)象映射為單個(gè)字段值。給定一個(gè)對(duì)象,flattened類型映射將解析出它的葉子值嫌吠,并將它們作為關(guān)鍵字索引到一個(gè)字段中。扁平的對(duì)象字段目前無(wú)法存儲(chǔ)掺炭,不能在映射中指定存儲(chǔ)參數(shù)辫诅。
- 操作示例如下:
PUT my-index-000008
{"mappings":{"properties":{"title":{"type":"text"},"labels":{"type":"flattened"}}}}
POST my-index-000008/_doc/1
{"title":"Results are not sorted correctly.","labels":{"priority":"urgent","release":["v1.2.5","v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
搜索數(shù)據(jù)時(shí),支持基本的查詢
GET my-index-000008/_search
{"query":{"match":{"labels.release":"v1.2.5"}}}
- 如果對(duì)象具有大量或未知數(shù)量的唯一鍵涧狮,那么使用該數(shù)據(jù)類型將整個(gè)JSON對(duì)象創(chuàng)建一個(gè)字段映射炕矮,有助于防止映射爆發(fā)。
- 該字段類型的對(duì)象具有一些限制者冤,其中包括只允許基本的查詢肤视,不支持?jǐn)?shù)值范圍查詢或高亮顯示,不支持通配符引用字段key查詢涉枫。
- 支持的類型參數(shù):boost(默認(rèn)1.0)邢滑、doc_values(默認(rèn)true)、eager_global_ordinals(默認(rèn)false)愿汰、ignore_above困后、 index(默認(rèn)true)、index_options衬廷、null_value(默認(rèn)null)摇予、similarity(默認(rèn)BM25)、split_queries_on_whitespace(默認(rèn)false)吗跋,所以在默認(rèn)情況下侧戴,該類型字段支持可搜索,不可存儲(chǔ)跌宛。
Nested
- 描述:嵌套對(duì)象類型酗宋,類型值nested,是對(duì)象數(shù)據(jù)類型的特殊版本秩冈,它允許以一種可以互相獨(dú)立查詢的方式對(duì)對(duì)象數(shù)組進(jìn)行索引本缠。
使用嵌套對(duì)象類型對(duì)文檔的查詢開(kāi)銷很大,如果需要為對(duì)象數(shù)組建立索引并維護(hù)數(shù)組中每個(gè)對(duì)象的獨(dú)立性(可搜索等)入问,那么可以使用嵌套對(duì)象類型丹锹。 - 在內(nèi)部,嵌套對(duì)象索引數(shù)組中的每個(gè)對(duì)象作為一個(gè)單獨(dú)的隱藏文檔芬失,這意味著每個(gè)嵌套對(duì)象可以通過(guò)嵌套查詢獨(dú)立于其他對(duì)象進(jìn)行查詢楣黍。
- 操作示例如下:
PUT my-index-000009
{"mappings":{"properties":{"user":{"type":"nested"}}}}
PUT my-index-000009/_doc/1
{"group":"fans","user":[{"first":"John","last":"Smith"},{"first":"Alice","last":"White"}]}
# 返回匹配的數(shù)據(jù),如果是普通Object類型棱烂,查不到數(shù)據(jù)
GET my-index-000009/_search
{"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}}}}}
# 返回匹配的數(shù)據(jù)租漂,并且高亮顯示每個(gè)對(duì)象中first字段
GET my-index-000009/_search
{"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}},"inner_hits":{"highlight":{"fields":{"user.first":{}}}}}}}
Join
- 描述:連接對(duì)象類型,類型值join,它在具有相同索引的文檔中創(chuàng)建父/子關(guān)系哩治。關(guān)系部分定義了文檔中的一組可能的關(guān)系秃踩,每個(gè)關(guān)系分別是父名稱和子名稱。
- 操作示例如下:
(1)定義父/子關(guān)系如下:
# my_join_field字段业筏,定義了簡(jiǎn)單的關(guān)系憔杨,question是answer的父類。
PUT my-index-000010
{
"mappings": {
"properties": {
"my_id": {
"type": "keyword"
},
"my_join_field": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
其中蒜胖,名稱為my_join_field字段為join字段類型消别,定義了簡(jiǎn)單的關(guān)系,question是answer的父類台谢。
(2)索引name="question"的數(shù)據(jù):
# 索引數(shù)據(jù)
PUT my-index-000010/_doc/1?refresh
{
"my_id": "1",
"text": "This is a question",
"my_join_field": {
"name": "question"
}
}
PUT my-index-000010/_doc/2?refresh
{
"my_id": "2",
"text": "This is another question",
"my_join_field": {
"name": "question"
}
}
(3)接下來(lái)索引name="answer"(指定parent=1寻狂,即與文檔1建立父類關(guān)系)的數(shù)據(jù):
PUT my-index-000010/_doc/3?routing=1&refresh
{
"my_id": "3",
"text": "This is an answer",
"my_join_field": {
"name": "answer",
"parent": "1"
}
}
PUT my-index-000010/_doc/4?routing=1&refresh
{
"my_id": "4",
"text": "This is another answer",
"my_join_field": {
"name": "answer",
"parent": "1"
}
}
(4)查詢聚合數(shù)據(jù),條件是name="answer" 并且 parent_id=1朋沮。
GET my-index-000010/_search
{
"query": {
"parent_id": {
"type": "answer",
"id": "1"
}
},
"aggs": {
"parents": {
"terms": {
"field": "my_join_field#question",
"size": 10
}
}
}
}
(5)返回結(jié)果片段如下
"aggregations" : {
"parents" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "1",
"doc_count" : 2
}
]
}
}
2.3 結(jié)構(gòu)體類型
Range
- 描述:范圍類型家族蛇券,類型值包括integer_range、float_range朽们、long_range怀读、double_range、date_range骑脱、ip_range菜枷。
- 操作示例如下:
PUT my-index-000011
{
"mappings": {
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"ip_allowlist": {
"type": "ip_range"
}
}
}
}
PUT my-index-000011/_doc/1?refresh
{
"expected_attendees": {
"gte": 10,
"lte": 20
},
"time_frame": {
"gte": "2015-10-31 12:00:00",
"lte": "2015-11-01"
},
"ip_allowlist": "192.168.0.0/16"
}
# term query
GET my-index-000011/_search
{"query":{"term":{"expected_attendees":{"value":12}}}}
# 時(shí)間范圍查詢是否匹配
GET my-index-000011/_search
{"query":{"range":{"time_frame":{"gte":"2015-10-31","lte":"2015-11-01","relation":"within"}}}}
# IP地址查詢是否匹配
GET my-index-000011/_search
{"query":{"term":{"ip_allowlist":{"value":"192.124.1.100"}}}}
- 支持的類型參數(shù):coerce(默認(rèn)true)、boost(默認(rèn)1.0)叁丧、
index(默認(rèn)true)啤誊、store(默認(rèn)false),所以在默認(rèn)情況下拥娄,該類型字段支持可搜索蚊锹,不可存儲(chǔ)。
IP
- 描述:IP字段類型稚瘾,類型值ip牡昆,支持索引或者存儲(chǔ)IPv4或IPv6地址。
- 操作示例如下:
# 創(chuàng)建索引摊欠,Mapping包含ip類型
PUT my-index-000012
{
"mappings": {
"properties": {
"ip_addr": {
"type": "ip"
}
}
}
}
#索引數(shù)據(jù)
PUT my-index-000012/_doc/1
{"ip_addr":"192.168.1.1"}
#查詢ip數(shù)據(jù)
GET my-index-000012/_search
{"query":{"term":{"ip_addr":"192.168.0.0/16"}}}
- 支持的類型參數(shù):boost(默認(rèn)1.0)丢烘、doc_values(默認(rèn)true)、ignore_malformed(默認(rèn)false)些椒、 index(默認(rèn)true)播瞳、null_value(默認(rèn)null)、store(默認(rèn)false)免糕,所以在默認(rèn)情況下赢乓,該類型字段支持可搜索忧侧,不可存儲(chǔ)。
2.4 聚合數(shù)據(jù)類型
Histogram
- 描述:直方圖類型牌芋,類型值histogram蚓炬,用于存儲(chǔ)表示直方圖的預(yù)聚合數(shù)字?jǐn)?shù)據(jù)的字段,這個(gè)數(shù)據(jù)是用兩個(gè)成對(duì)的數(shù)組定義的:
(1)一個(gè)double類型數(shù)組values姜贡,表示直方圖的桶數(shù)试吁,這些值必須按升序提供。
(2)一個(gè)對(duì)應(yīng)的integer類型計(jì)數(shù)數(shù)組counts楼咳,表示每個(gè)桶的個(gè)數(shù),這些數(shù)字必須是正的或零烛恤。
因?yàn)関alues數(shù)組中的元素對(duì)應(yīng)于count數(shù)組中相同位置的元素母怜,所以這兩個(gè)數(shù)組必須具有相同的長(zhǎng)度。 - 操作示例如下:
# my_histogram, 直方圖類型字段存儲(chǔ)百分比數(shù)據(jù)
# my_text, keyword類型字段存儲(chǔ)直方圖標(biāo)題
PUT my-index-000013
{
"mappings" : {
"properties" : {
"my_histogram" : {
"type" : "histogram"
},
"my_text" : {
"type" : "keyword"
}
}
}
}
# 存儲(chǔ)預(yù)聚合數(shù)據(jù)到histogram_1 和 histogram_2
PUT my-index-000013/_doc/1
{
"my_text" : "histogram_1",
"my_histogram" : {
"values" : [0.1, 0.2, 0.3, 0.4, 0.5],
"counts" : [3, 7, 23, 12, 6]
}
}
PUT my-index-000013/_doc/2
{
"my_text" : "histogram_2",
"my_histogram" : {
"values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
"counts" : [8, 17, 8, 7, 6, 2]
}
}
- 對(duì)于每個(gè)文檔缚柏,直方圖類型字段只能存儲(chǔ)values數(shù)組和count數(shù)組組成的一對(duì)苹熏,不支持嵌套數(shù)組。并且由于直方圖數(shù)據(jù)沒(méi)有被索引币喧,所以只能使用直方圖類型字段用于聚合和查詢轨域。直方圖類型字段不支持排序。
- 直方圖類型字段數(shù)據(jù)被存儲(chǔ)為二進(jìn)制文檔值杀餐,而不是索引干发。它的大小以字節(jié)為單位最多為13 * numValues,其中numValues是所提供數(shù)組的長(zhǎng)度史翘。
2.5 文本搜索類型
Text
- 描述:文本類型枉长,全文索引的字段,例如電子郵件的正文或產(chǎn)品的描述琼讽。這些字段將被分析必峰,也就是說(shuō),它們將通過(guò)分析器在索引之前將字符串轉(zhuǎn)換為單個(gè)term的集合钻蹬。這個(gè)分析過(guò)程允許Elasticsearch在每個(gè)全文字段中搜索單個(gè)單詞吼蚁。文本類型字段不用于排序,也很少用于聚合(盡管重要文本聚合是一個(gè)明顯的例外)问欠。如果需要索引結(jié)構(gòu)化的內(nèi)容肝匆,如電子郵件地址、主機(jī)名溅潜、狀態(tài)碼或標(biāo)簽术唬,那么盡可能使用keyword類型字段。
- 操作示例如下:
PUT my-index-000014
{
"mappings": {
"properties": {
"full_name": {
"type": "text"
}
}
}
}
PUT my-index-000014/_doc/1
{"full_name":"Johnny Lu"}
- 支持的類型參數(shù):
(1)analyzer:在索引時(shí)和搜索時(shí)都應(yīng)該用于文本字段的分析器(除非被search_analyzer覆蓋)滚澜。默認(rèn)為standard分析器粗仓,或index分析器。
(2)其他參數(shù):boost(默認(rèn)1.0)、eager_global_ordinals(默認(rèn)false)借浊、fielddata(默認(rèn)false)塘淑、fielddata_frequency_filter(默認(rèn)加載所有值)、fields蚂斤、 index(默認(rèn)true)存捺、index_options、index_prefixes曙蒸、index_phrases捌治、norms(默認(rèn)true)、position_increment_gap纽窟、store(默認(rèn)false)肖油、search_analyzer、search_quote_analyzer(默認(rèn)search_analyzer)臂港、similarity(默認(rèn)BM25)森枪、term_vector(默認(rèn)沒(méi)有)、meta审孽。
completion
- 描述:完成類型县袱,類型值completion,用于自動(dòng)完成suggestions佑力。
- 操作示例如下:
PUT my-index-000015
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
},
"title": {
"type": "keyword"
}
}
}
}
- 支持的類型參數(shù):
(1)analyzer:索引時(shí)要使用的分析器式散,默認(rèn)為simple分析器。
(2)search_analyzer:搜索時(shí)要使用的分析器搓萧,默認(rèn)與參數(shù)analyzer一樣杂数。
(3)其他參數(shù):preserve_separators(默認(rèn)true)、preserve_position_increments(默認(rèn)true)瘸洛、max_input_length揍移。
search_as_you_type
- 描述:類型值search_as_you_type,search_as_you_type字段類型類似文本類型反肋,經(jīng)過(guò)優(yōu)化那伐,它會(huì)創(chuàng)建一系列子字段,通過(guò)對(duì)這些子字段進(jìn)行分析石蔗,并找出通過(guò)部分來(lái)匹配整個(gè)文本值的有效term罕邀,將其索引。該類型的字段既支持前綴補(bǔ)全养距,也支持中綴補(bǔ)全诉探。
- 操作示例如下:
PUT my-index-000016
{"mappings":{"properties":{"my_field":{"type":"search_as_you_type"}}}}
PUT my-index-000016/_doc/1?refresh
{"my_field":"quick brown fox jump lazy dog"}
GET my-index-000016/_search
{
"query": {
"multi_match": {
"query": "brown f",
"type": "bool_prefix",
"fields": [
"my_field",
"my_field._2gram",
"my_field._3gram"
]
}
}
}
- 子字段中shingles的大小可以使用max_shingle_size映射參數(shù)來(lái)配置。默認(rèn)值為3棍厌,該參數(shù)的有效值為整數(shù)值2 - 4(含整數(shù)值)肾胯。
- 支持的類型參數(shù):
(1)analyzer:在索引時(shí)和搜索時(shí)都應(yīng)該用于文本字段的分析器(除非被search_analyzer覆蓋)竖席。默認(rèn)為standard分析器,或index分析器敬肚。
(2)search_analyzer:搜索時(shí)要使用的分析器毕荐,默認(rèn)與參數(shù)analyzer一樣。
(3)其他參數(shù): index(默認(rèn)true)艳馒、norms(默認(rèn)true)憎亚、store(默認(rèn)false)、search_quote_analyzer(默認(rèn)search_analyzer)弄慰、similarity(默認(rèn)BM25)第美、term_vector(默認(rèn)沒(méi)有)。
Token count
描述:標(biāo)記計(jì)數(shù)類型陆爽,類型值token_count斋日,token_count類型的字段實(shí)際上是一個(gè)integer字段,該類型字段分析接受的字符串值墓陈,統(tǒng)計(jì)出字符串中標(biāo)記的數(shù)量并對(duì)其進(jìn)行索引。
操作示例如下:
PUT my-index-000017
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"length": {
"type": "token_count",
"analyzer": "standard"
}
}
}
}
}
}
PUT my-index-000017/_doc/1
{ "name": "John Smith" }
PUT my-index-000017/_doc/2
{ "name": "Rachel Alice Williams" }
GET my-index-000017/_search
{"query":{"term":{"name.length":3}}}
- 支持的類型參數(shù):
(1)analyzer:用來(lái)分析字符串值的分析器第献。必需的贡必。為了獲得最佳性能,請(qǐng)使用不帶tokens過(guò)濾器的分析器庸毫。
(2)enable_position_increments:指示是否應(yīng)該計(jì)算位置增量仔拟。如果不計(jì)算分析器過(guò)濾器刪除的tokens,則設(shè)置為false飒赃。默認(rèn)值為true利花。
(3)其他參數(shù):boost(默認(rèn)1.0)、doc_values(默認(rèn)true)载佳、index(默認(rèn)true)炒事、null_value(默認(rèn)null)、store(默認(rèn)false)蔫慧。
2.6 文檔排名類型
Dense vector
- 描述:密集向量場(chǎng)類型挠乳,類型值dense_vector,dense_vector類型字段存儲(chǔ)浮點(diǎn)值的密集向量姑躲。向量的最大維數(shù)不應(yīng)超過(guò)2048睡扬,dense_vector類型字段是一個(gè)單值字段。這些向量可用于文檔評(píng)分黍析。例如卖怜,文檔分?jǐn)?shù)可以表示給定查詢向量和索引文檔向量之間的距離。
- 操作示例如下:
PUT my-index-000018
{
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3
},
"my_text" : {
"type" : "keyword"
}
}
}
}
PUT my-index-000018/_doc/1
{"my_text":"text1","my_vector":[0.5,10,6]}
PUT my-index-000018/_doc/2
{"my_text":"text2","my_vector":[-0.5,10,10]}
- 支持的類型參數(shù):
dims:向量的維數(shù)阐枣,是必需的參數(shù)
Rank feature
- 描述:特征排名類型马靠,類型值rank_feature奄抽,rank_feature類型字段只接受數(shù)字來(lái)建立索引,以便后續(xù)使用rank_feature查詢時(shí)來(lái)增強(qiáng)查詢中的文檔虑粥。
- 操作示例如下:
PUT my-index-000019
{
"mappings": {
"properties": {
"pagerank": {
"type": "rank_feature"
},
"url_length": {
"type": "rank_feature",
"positive_score_impact": false
}
}
}
}
PUT my-index-000019/_doc/1
{"pagerank":8,"url_length":22}
PUT my-index-000019/_doc/2
{"pagerank":9,"url_length":23}
# 使用rank_feature查詢如孝,與值正相關(guān)排序
GET my-index-000019/_search
{"query":{"rank_feature":{"field":"pagerank"}}}
- rank_feature類型字段只支持單值字段和嚴(yán)格正數(shù)值。多值字段和負(fù)數(shù)值將被拒絕娩贷。
- rank_feature類型字段不支持查詢第晰、排序或聚合。只能在rank_feature查詢中使用彬祖。
- rank_feature類型字段僅保留9位有效位以保證精度茁瘦,換算成相對(duì)誤差約為0.4%。
- 與分?jǐn)?shù)負(fù)相關(guān)的排名特性應(yīng)該將參數(shù)positive_score_impact設(shè)置為false(默認(rèn)為true)储笑。rank_feature查詢將使用它來(lái)修改評(píng)分公式甜熔,使得分隨著特征值的增加而減少,而不是增加突倍。例如在網(wǎng)絡(luò)搜索中腔稀,url長(zhǎng)度是一個(gè)常用的特征,它與分?jǐn)?shù)呈負(fù)相關(guān)羽历。
Rank features
- 描述:特征集排名類型焊虏,類型值rank_features,rank_features字段可以為數(shù)值特征向量建立索引秕磷,以便后續(xù)使用rank_feature查詢來(lái)增強(qiáng)查詢中的文檔诵闭。它類似于rank_feature數(shù)據(jù)類型,rank_features更適合在特性列表稀疏的情況下使用澎嚣。
- 操作示例如下:
PUT my-index-000020
{
"mappings": {
"properties": {
"topics": {
"type": "rank_features"
}
}
}
}
PUT my-index-000020/_doc/1
{"topics":{"politics":20,"economics":50.8}}
PUT my-index-000020/_doc/2
{"topics":{"politics":5.2,"sports":80.1}}
GET my-index-000020/_search
{"query":{"rank_feature":{"field":"topics.politics"}}}
- rank_features類型字段必須是具有字符串鍵和嚴(yán)格為正數(shù)值的散列疏尿。
- rank_features類型字段只支持單值特性和嚴(yán)格正數(shù)值。多值字段和零值或負(fù)數(shù)值將被拒絕
- rank_features類型字段不支持查詢易桃、排序或聚合褥琐。只能在rank_feature查詢中使用。
- rank_features類型字段僅保留9位有效位以保證精度颈抚,換算成相對(duì)誤差約為0.4%踩衩。
2.7 空間數(shù)據(jù)類型
Geo point
- 描述:地理空間類型,類型值geo_point贩汉,geo_point類型的字段接受經(jīng)緯度對(duì)驱富。
- 可用5種數(shù)據(jù)類型表示geo_point數(shù)據(jù)類型,操作示例如下:
PUT my-index-000021
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
# 使用object對(duì)象類型匹舞,指定lat和lon褐鸥,表示geo_point:
PUT my-index-000021/_doc/1
{"text":"Geo-point as an object","location":{"lat":41.12,"lon":-71.34}}
# 使用字符串格式:“l(fā)at,lon” ,表示geo_point:
PUT my-index-000021/_doc/2
{"text":"Geo-point as a string","location":"41.12,-71.34"}
# 使用geohash字符串赐稽,表示geo_point
PUT my-index-000021/_doc/3
{"text":"Geo-point as a geohash","location":"drm3btev3e86"}
# 使用數(shù)組形式:[lon, lat]叫榕,表示geo_point
PUT my-index-000021/_doc/4
{"text":"Geo-point as an array","location":[-71.34,41.12]}
# 使用文本點(diǎn)表示浑侥,格式為“POINT(lon lat)”,表示geo_point
PUT my-index-000021/_doc/5
{"text":"Geo-point as a WKT POINT primitive","location":"POINT (-71.34 41.12)"}
GET my-index-000021/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 42,
"lon": -72
},
"bottom_right": {
"lat": 40,
"lon": -74
}
}
}
}
}
- 支持的類型參數(shù):
(1)ignore_malformed:如果值為true晰绎,則忽略有缺陷的地理點(diǎn)寓落。如果值為false(默認(rèn)),遇到格式不正確的地理點(diǎn)會(huì)拋出一個(gè)異常并拒絕整個(gè)文檔荞下。
(2)ignore_z_value:如果值為true(默認(rèn)的)伶选,三維空間點(diǎn)將被接受(存儲(chǔ)在source中),但只有緯度和經(jīng)度值將被索引尖昏;第三個(gè)維度被忽略仰税。如果為false,除了緯度和經(jīng)度以外抽诉,遇到其他任何地理點(diǎn)都會(huì)拋出異常并拒絕整個(gè)文檔陨簇。
(3)null_value:接受一個(gè)geopoint值,它代替任何顯式的空值迹淌。默認(rèn)值為null河绽,這意味著該字段被視為丟失。
Point
- 描述:點(diǎn)數(shù)據(jù)類型唉窃,類型值point葵姥,point類型用于對(duì)落在二維平面坐標(biāo)系中的任意x、y對(duì)的索引和搜索句携。
- 指定一個(gè)point類型有四種方式,操作示例如下:
PUT my-index-000022
{
"mappings": {
"properties": {
"location": {
"type": "point"
}
}
}
}
# 使用object對(duì)象類型允乐,指定x和y矮嫉,表示point:
PUT my-index-000022/_doc/1
{"text":"Point as an object","location":{"x":41.12,"y":-71.34}}
# 使用字符串格式:“x,y” ,表示point:
PUT my-index-000022/_doc/2
{"text":"Point as a string","location":"41.12,-71.34"}
# 使用數(shù)組形式:[x, y]牍疏,表示point
PUT my-index-000022/_doc/3
{"text":"Point as an array","location":[41.12,-71.34]}
# 使用文本點(diǎn)表示蠢笋,格式為“POINT(x y)”,表示geo_point
PUT my-index-000022/_doc/4
{"text":"Point as a WKT POINT primitive","location":"POINT (41.12 -71.34)"}
- 目前還不能直接對(duì)point類型數(shù)據(jù)進(jìn)行排序或字段搜索鳞陨。只能通過(guò)_source字段搜索昨寞。
- 支持的類型參數(shù):
(1)ignore_malformed:如果值為true,則忽略有缺陷的點(diǎn)厦滤。如果值為false(默認(rèn))援岩,遇到格式不正確的點(diǎn)會(huì)拋出一個(gè)異常并拒絕整個(gè)文檔。
(2)ignore_z_value:如果值為true(默認(rèn)的)掏导,三個(gè)維度點(diǎn)將被接受(存儲(chǔ)在source中)享怀,但只有x和y的值將被索引;第三個(gè)維度被忽略趟咆。如果為false添瓷,除了x和y以外梅屉,遇到其他任何維度都會(huì)拋出異常并拒絕整個(gè)文檔。
(3)null_value:接受一個(gè)point值鳞贷,它代替任何顯式的空值坯汤。默認(rèn)值為null,這意味著該字段被視為丟失搀愧。
2.8 其他類型
Percolator
- 描述:過(guò)濾器類型惰聂,類型值percolator,percolator類型將json結(jié)構(gòu)解析為原生查詢并存儲(chǔ)該查詢妈橄,以便percolate query可以使用它來(lái)匹配所提供的文檔庶近。
- 操作示例如下:
# 配置percolator字段類型
PUT my-index-01
{
"mappings": {
"properties": {
"query" : {
"type" : "percolator"
},
"body" : {
"type": "text"
}
}
}
}
# 為索引定義一個(gè)別名,這樣眷蚓,在重索引系統(tǒng)/應(yīng)用程序的情況下鼻种,不需要更改查詢索引名
POST _aliases
{
"actions": [
{
"add": {
"index": "my-index",
"alias": "queries"
}
}
]
}
# 將原生查詢解析并索引,查詢條件為文檔字段body包含"quick brown fox"之一
PUT queries/_doc/1?refresh
{
"query" : {
"match" : {
"body" : "quick brown fox"
}
}
}
# percolate查詢沙热,所提供文檔的字段名與查詢條件中的字段名(如body)必須相同
GET /queries/_search
{
"query": {
"percolate" : {
"field" : "query",
"document" : {
"body" : "fox jumps over the lazy dog"
}
}
}
}
3. 結(jié)語(yǔ)
這里只是簡(jiǎn)單介紹了Elasticsearch的部分字段類型叉钥,如有需要,可通過(guò)Elasticsearch官方文檔進(jìn)一步了解更多數(shù)據(jù)類型篙贸。