前言
映射參數(shù)(mapping parameters)用于字段類型的映射,每個(gè)字段類型有一個(gè)或多個(gè)映射參數(shù)搭配使用软驰,每個(gè)映射參數(shù)都有其特定的作用涧窒,以下是對(duì)字段映射使用的一些重要映射參數(shù)的說明。
- 上圖是映射參數(shù)表锭亏,列出了一些重要的映射參數(shù)纠吴。
analyzer
- analyzer參數(shù)指定一個(gè)用于索引text字段時(shí)的文本分析的分析器,如果search_analyzer參數(shù)沒有覆蓋慧瘤,該分析器也用于搜索時(shí)的文本分析戴已。
- 只有text字段支持analyzer參數(shù)。
- 例如锅减,自定義一個(gè)分析器糖儡,分析器的分詞器tokenizer采用standard(按空格先拆分詞), 過濾器filter使用lowercase(轉(zhuǎn)換為小寫)怔匣, 通過analyzer參數(shù)指定該分析器握联,示例如下:
PUT my_index_01
{
"settings":{
"analysis":{
"analyzer":{
"my_analyzer":{
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase"
]
}
}
}
},
"mappings":{
"properties":{
"title": {
"type":"text",
"analyzer":"my_analyzer"
}
}
}
}
PUT my_index_01/_doc/1
{"title":"The Quick Brown Fox"}
# 通過小寫也可以查詢匹配結(jié)果數(shù)據(jù)
GET my_index_01/_search
{"query":{"query_string":{"query":"the quick brown fox"}}}
search_analyzer
- 默認(rèn)情況下,搜索時(shí)將使用參數(shù)analyzer定義的分析器,從而保持與索引時(shí)一樣的分析器金闽,不過可以設(shè)置search_analyzer來覆蓋搜索時(shí)的分析器纯露,示例如下:
# 雙斜線//在執(zhí)行時(shí)需要去掉
PUT my_index_01
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
PUT my_index_01/_doc/1 //1
{"text":"Quick Brown Fox"}
GET my_index_01/_search //2
{"query":{"match":{"text":{"query":"Quick Br","operator":"and"}}}}
注釋1:字段索引時(shí)拆分后的詞條:[ q, qu, qui, quic, quick, b, br, bro, brow, brown, f, fo, fox ]
注釋2:字段搜索時(shí)拆分后的詞條:[ quick, br ]
search_quote_analyzer
- search_quote_analyzer參數(shù)指定一個(gè)短語分析器,在處理短語查詢(phrases query)禁用停止詞時(shí)特別有用代芜,當(dāng)search_quote_analyzer參數(shù)設(shè)置時(shí)埠褪,analyzer參數(shù)和search_analyzer參數(shù)也必須設(shè)置。
- 禁用字段的短語的停止詞示例如下:
# 雙斜線//在執(zhí)行時(shí)需要去掉
PUT my_index_01
{
"settings":{
"analysis":{
"analyzer":{
"my_analyzer":{ //1
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase"
]
},
"my_stop_analyzer":{ //2
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase",
"english_stop"
]
}
},
"filter":{
"english_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
},
"mappings":{
"properties":{
"title": {
"type":"text",
"analyzer":"my_analyzer", //3
"search_analyzer":"my_stop_analyzer", //4
"search_quote_analyzer":"my_analyzer" //5
}
}
}
}
PUT my_index_01/_doc/1
{"title":"The Quick Brown Fox"}
PUT my_index_01/_doc/2
{"title":"A Quick Brown Fox"}
GET my_index_01/_search
{"query":{"query_string":{"query":"\"the quick brown fox\""}}} //6
注釋1:my_analyzer分析器將標(biāo)記所有詞元包括停用詞蜒犯,且標(biāo)記的詞元為小寫组橄。比如文本“The Quick Brown Fox”經(jīng)過分析分詞后變成[the,quick罚随,brown玉工,fox]。
注釋2:my_stop_analyzer分析器將會(huì)移除停用詞淘菩,比如文本“The Quick Brown Fox”經(jīng)過分析分詞后變成[quick遵班, brown, fox]潮改,停用詞不會(huì)被標(biāo)記狭郑。
注釋3:analyzer指定索引時(shí)使用的分析器,設(shè)置為my_analyzer汇在。
注釋4:search_analyzer指定搜索時(shí)使用的分析器翰萨,設(shè)置為my_stop_analyzer。
注釋5:search_quote_analyzer參數(shù)設(shè)置為my_analyzer糕殉。確保短語查詢時(shí)停用詞不會(huì)被移除亩鬼。
注釋6:由于查詢被包裝在引號(hào)中,因此會(huì)檢測到短語查詢阿蝶,因此會(huì)使用search_quote_analyzer來確保停止詞不會(huì)從查詢中刪除雳锋。然后,my_analyzer將返回以下標(biāo)記[The, quick, brown, fox]羡洁,這些標(biāo)記將匹配其中一個(gè)文檔玷过。同時(shí),詞條查詢將用my_stop_analyzer分析筑煮,它將過濾掉停止詞辛蚊。因此,搜索“The quick brown fox”或“A quick brown fox”都會(huì)返回兩個(gè)文檔真仲,因?yàn)閮蓚€(gè)文檔都包含以下標(biāo)記[quick, brown, fox]嚼隘。如果沒有search_quote_analyzer,就不可能對(duì)短語查詢進(jìn)行精確匹配袒餐,因?yàn)槎陶Z查詢中的停止詞將被刪除飞蛹,從而導(dǎo)致兩個(gè)文檔都匹配谤狡。
boost
- 通過設(shè)置boost參數(shù)的值,改變相關(guān)性得分的計(jì)算卧檐,進(jìn)而可以影響單個(gè)字段相比于其他字段在查詢時(shí)自動(dòng)提升墓懂。
- 示例如下:
# 雙斜線//在執(zhí)行時(shí)需要去掉
PUT my_index_01
{
"mappings": {
"properties": {
"title": {
"type": "text",
"boost": 2
},
"content": {
"type": "text"
}
}
}
}
PUT my_index_01/_doc/1
{"title":"Quick Fox","content":"Brown Fox"}
PUT my_index_01/_doc/2
{"title":"Brown Fox","content":"Quick Fox"}
GET my_index_01/_search //1
{
"query": {
"bool": {
"should": [
{
"query_string": {
"default_field": "title",
"query": "Brown"
}
},
{
"query_string": {
"default_field": "content",
"query": "Brown"
}
}
]
}
}
}
注釋1:查詢時(shí),title字段上匹配項(xiàng)的權(quán)重是content字段上的兩倍霉囚,boost默認(rèn)是1.0捕仔,查詢出結(jié)果文檔2得分是文檔1得分的兩倍。
- boost只應(yīng)用于查詢時(shí)提升盈罐,并且僅應(yīng)用于詞條查詢(前綴榜跌、范圍和模糊查詢不被增強(qiáng))。
- 也可以通過在查詢中直接使用boost參數(shù)來實(shí)現(xiàn)相同的效果盅粪。示例如下:
POST my_index_01/_search
{"query":{"match":{"title":{"query":"Quick Fox","boost":2}}}}
coerce
- coerce(強(qiáng)制)參數(shù)默認(rèn)值true钓葫,表示嘗試清除臟數(shù)據(jù)值,以符合字段的數(shù)據(jù)類型票顾,例如础浮,如果字段數(shù)據(jù)類型為整數(shù)類型,那么輸入的字符串強(qiáng)制轉(zhuǎn)換為數(shù)字奠骄,浮點(diǎn)數(shù)將被截?cái)喽雇H绻鹀oerce參數(shù)設(shè)置為false,那么遇到臟數(shù)據(jù)不會(huì)進(jìn)行強(qiáng)制轉(zhuǎn)換含鳞,而是直接拋出異常影锈。
示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"number_one": {
"type": "integer"
},
"number_two": {
"type": "integer",
"coerce": false
}
}
}
}
# 因?yàn)閏oerce參數(shù)設(shè)置false,所以直接拋出異常
PUT my_index_01/_doc/1
{"number_two":"5"}
- 通過配置參數(shù)index.mapping.coerce蝉绷,可以進(jìn)行索引級(jí)別的禁用coercion鸭廷,類型級(jí)別的coercion作用優(yōu)先級(jí)大于索引級(jí)別,示例如下:
PUT my_index_01
{
"settings": {
"index.mapping.coerce": false
},
"mappings": {
"properties": {
"number_one": {
"type": "integer",
"coerce": true
},
"number_two": {
"type": "integer"
}
}
}
}
# 類型級(jí)別的coercion設(shè)置開啟潜必,成功索引,強(qiáng)制轉(zhuǎn)換數(shù)據(jù)
PUT my_index_01/_doc/1
{ "number_one": "10" }
# 字段number_two繼承索引級(jí)coercion的設(shè)置沃但,直接拋出異常
PUT my_index_01/_doc/2
{ "number_two": "10" }
copy_to
- copy_to參數(shù)用于將多個(gè)字段的值復(fù)制到組合字段中磁滚,然后可以將這個(gè)組合字段作為單個(gè)字段進(jìn)行查詢。如果經(jīng)常搜索多個(gè)字段宵晚,可以通過copy_to參數(shù)來搜索更少的字段垂攘,進(jìn)而提高搜索速度,操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
PUT my_index_01/_doc/1
{"first_name":"John","last_name":"Smith"}
GET my_index_01/_search
{
"query": {
"match": {
"full_name": {
"query": "John Smith",
"operator": "and"
}
}
}
}
doc_values
- doc_values參數(shù)為true表示激活字段的Doc Values淤刃,默認(rèn)情況下每個(gè)字段的 Doc Values 都是激活的晒他。幾乎所有類型字段都支持doc_values參數(shù),只有text和annotated_text字段除外逸贾。
- Doc Values是一個(gè)列式存儲(chǔ)結(jié)構(gòu)陨仅,在索引時(shí)創(chuàng)建的津滞,當(dāng)字段索引時(shí),Elasticsearch 為了能夠快速檢索灼伤,會(huì)把字段的值加入到倒排索引中触徐,同時(shí)它也會(huì)存儲(chǔ)該字段的Doc Values。
- Doc Values支持需要在每個(gè)文檔基礎(chǔ)上查找字段值的聚合狐赡、排序等其他操作撞鹉,它常被應(yīng)用到以下場景:
(1)對(duì)一個(gè)字段進(jìn)行排序
(2)對(duì)一個(gè)字段進(jìn)行聚合
(3)某些過濾,比如地理位置過濾
(4)某些與字段相關(guān)的腳本計(jì)算
這些場景使用Doc Values列式結(jié)構(gòu)比倒排索引結(jié)構(gòu)有很大優(yōu)勢颖侄。 - 字段的Doc Values需要很大的空間開銷鸟雏,如果確定一個(gè)字段不需要排序或聚合,或腳本訪問字段值览祖,那么可以禁用字段Doc Values孝鹊,以節(jié)省磁盤空間,示例如下:
# session_id字段已經(jīng)禁用Doc Values穴墅,它仍然可以繼續(xù)被查詢惶室,只是有些場景查詢效率沒那么理想
PUT my_index_01
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword"
},
"session_id": {
"type": "keyword",
"doc_values": false
}
}
}
}
dynamic
通過設(shè)置參數(shù)dynamic,可以在文檔和對(duì)象級(jí)別控制動(dòng)態(tài)映射玄货,參數(shù)dynamic可以設(shè)置為下列三種值:
(1)true:將新的檢測到的字段添加到映射中皇钞。(默認(rèn))
(2)false:忽略新檢測到的字段。這些字段將不會(huì)被索引松捉,因此不能被搜索夹界,但仍然會(huì)出現(xiàn)在返回命中的_source字段中。這些字段將不會(huì)添加到映射中隘世,新的字段必須顯式添加可柿。
(3)strict:如果檢測到新字段,則拋出異常并拒絕索引文檔丙者。新字段必須顯式地添加到映射中复斥。
操作示例如下:
# 1 - dynamic設(shè)置為strict,并且是類型級(jí)別械媒,表示不會(huì)動(dòng)態(tài)添加top級(jí)字段
# 2 - user 對(duì)象繼承類型級(jí)別設(shè)置
# 3 - dynamic設(shè)置為true目锭,并且是對(duì)象級(jí)別,表示social_networks對(duì)象可以動(dòng)態(tài)添加字段
PUT my_index
{
"mappings": {
"dynamic": "strict", // 1
"properties": {
"user": { // 2
"properties": {
"social_networks": {
"dynamic": "true", // 3
"properties": {}
}
}
}
}
}
}
eager_global_ordinals
- eager_global_ordinals參數(shù)設(shè)置為true表示開啟全局序數(shù)映射纷捞,false表示禁止全局序數(shù)映射痢虹,默認(rèn)true。
- 如果是基于詞條的字段類型(如關(guān)鍵字)主儡, Elasticsearch會(huì)根據(jù)詞匯順序?yàn)槊總€(gè)詞條分配的一個(gè)遞增的整數(shù)或有序數(shù)奖唯,然后使用序數(shù)映射存儲(chǔ)的doc值,以獲得更緊湊的表示糜值。
- 字段的doc值只存儲(chǔ)序數(shù)丰捷,而不是原始的詞條坯墨,使用單獨(dú)的查找結(jié)構(gòu)在序數(shù)和詞條之間進(jìn)行轉(zhuǎn)換,每個(gè)索引分段定義自己的有序映射瓢阴,但是聚合在整個(gè)碎片上收集數(shù)據(jù)畅蹂。因此,為了能夠在分片級(jí)操作(如聚合)中使用序數(shù)荣恐,Elasticsearch創(chuàng)建了一個(gè)稱為全局序數(shù)的統(tǒng)一映射液斜。全局序號(hào)映射建立在分段序數(shù)之上,通過維護(hù)每個(gè)分段從全局序數(shù)到局部序數(shù)的映射來工作叠穆。
- 在搜索過程中使用序數(shù)之前少漆,必須先構(gòu)建全局序數(shù)映射。默認(rèn)情況下硼被,在搜索第一次需要全局序數(shù)時(shí)加載全局序數(shù)映射示损。通過全局序數(shù)映射可以提升聚合、排序等操作性能嚷硫,開啟示例如下:
PUT my_index_01/_mapping
{
"properties": {
"tags": {
"type": "keyword",
"eager_global_ordinals": true
}
}
}
- 全局序數(shù)在加載時(shí)間和內(nèi)存使用方面通常不會(huì)帶來很大的開銷检访。但是如果索引具有較大的碎片,或者字段包含大量唯一的詞條值仔掸,則加載全局序數(shù)的開銷可能很大脆贵。因?yàn)槿中驍?shù)為分片上的所有分段提供了統(tǒng)一的映射,所以當(dāng)一個(gè)新的分段創(chuàng)建可見后起暮,全局序數(shù)還需要完全地重新構(gòu)建卖氨。
- eager_global_ordinals不應(yīng)該用于凍結(jié)的索引,對(duì)于一個(gè)凍結(jié)索引负懦,全局序數(shù)在每次搜索時(shí)重建后被丟棄筒捺,當(dāng)請(qǐng)求它們時(shí)重新構(gòu)建,這導(dǎo)致在每次搜索時(shí)重新加載全局序數(shù)纸厉。有效方法是系吭,可以在凍結(jié)之前,索引應(yīng)該被強(qiáng)制合并到單個(gè)段颗品,這樣就避免了每次構(gòu)建全局序數(shù)肯尺。
enabled
- enabled參數(shù)控制字段是否被Elasticsearch索引,默認(rèn)情況下抛猫,Elasticsearch會(huì)嘗試索引所有輸入的字段蟆盹。通過設(shè)置enabled為false來禁止索引字段孩灯,禁止后Elasticsearch會(huì)完全跳過字段內(nèi)容的解析(異常類型的數(shù)據(jù)也會(huì)完全忽略)闺金。雖然仍然可以從_source字段檢索攻谁,但它不能以任何其他方式搜索或存儲(chǔ)筷畦。
- enabled只能應(yīng)用于頂級(jí)mapping定義和object字段中礼患。
- 例如桨踪,假設(shè)使用Elasticsearch作為web會(huì)話存儲(chǔ),希望只索引會(huì)話ID和上次更新時(shí)間掀亩,但不需要對(duì)會(huì)話數(shù)據(jù)本身查詢或運(yùn)行聚合舔哪,操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"user_id": {
"type": "keyword"
},
"last_updated": {
"type": "date"
},
"session_data": { //1
"type": "object",
"enabled": false
}
}
}
}
PUT my_index_01/_doc/session_1
{
"user_id": "kimchy",
"session_data": {
"arbitrary_object": {
"some_array": [ "foo","bar", { "baz": 2} ] //2
}
},
"last_updated": "2015-12-06T18:20:22"
}
PUT my_index_01/_doc/session_2
{
"user_id": "jpountz",
"session_data": "none", //3
"last_updated": "2015-12-06T18:22:13"
}
注釋1:session_data字段被禁用。
注釋2:任何數(shù)據(jù)都可以傳遞到session_data字段槽棍,因?yàn)樗鼘⒈煌耆雎浴?br>
注釋3:session_data也會(huì)忽略非JSON對(duì)象的值捉蚤。
- 整個(gè)mapping中也可設(shè)置被禁用,在這種情況下炼七,文檔會(huì)存儲(chǔ)在
_source字段中缆巧,但文檔的內(nèi)容不會(huì)以任何方式索引。操作示例如下:
PUT my_index_01
{"mappings":{"enabled":false}}
fielddata
- 如果搜索需要回答“哪些文檔包含這個(gè)詞條?”豌拙,而排序和聚合需要回答另一個(gè)問題:“這個(gè)文檔的這個(gè)字段的值是多少?”陕悬,大多數(shù)字段可以使用doc_valuse數(shù)據(jù)訪問模式來回答這些問題,但是text類型不支持doc_valuse按傅,所以Elasticsearch提供了另外一種數(shù)據(jù)結(jié)構(gòu)可用于text類型字段捉超,它就是fielddata數(shù)據(jù)結(jié)構(gòu),fielddata存儲(chǔ)內(nèi)存中唯绍,查詢時(shí)構(gòu)建拼岳,相反doc_valuse存儲(chǔ)磁盤上、索引時(shí)構(gòu)建推捐。具體點(diǎn)說裂问,fielddata數(shù)據(jù)結(jié)構(gòu)是在字段第一次用于聚合、排序或在腳本中使用時(shí)按需構(gòu)建的牛柒。通過讀取磁盤中每個(gè)分段的倒排索引堪簿,獲取詞條與文檔的關(guān)系并進(jìn)行逆轉(zhuǎn),最后將結(jié)果存儲(chǔ)在JVM堆內(nèi)存中皮壁。
- 默認(rèn)情況下椭更,text類型字段會(huì)禁用fielddata,因?yàn)閒ielddata會(huì)消耗大量堆空間蛾魄,特別是在加載高基數(shù)文本字段時(shí)虑瀑。一旦fielddata被加載到堆中,它在分段生命周期中一直存在滴须。此外舌狗,加載fielddata是一個(gè)昂貴的過程,可能會(huì)導(dǎo)致用戶體驗(yàn)延遲扔水。這就是為什么默認(rèn)情況下禁用fielddata的原因痛侍。開啟操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"tag": {
"type": "text",
"fielddata": true,
"fielddata_frequency_filter": { //1
"min": 0.001,
"max": 0.1,
"min_segment_size": 500
}
}
}
}
}
注釋1: fielddata_frequency_filter頻率過濾器用于減少加載到內(nèi)存中的詞條的數(shù)量,只加載每分段文檔頻率在min和max之間的分段魔市,min和max的值是0到1范圍的浮點(diǎn)數(shù)值主届,min_segment_size指定分段中應(yīng)該包含的最小文檔數(shù)赵哲,這樣可以完全排除小的分段。
每分段文檔頻率=分段中字段有值文檔數(shù)/分段中總的文檔數(shù)
- 一般不建議開啟fielddata君丁。如果既需要text類型字段用于全文搜索枫夺,也需要字段未分析以便能聚合操作,那么可以再定義一個(gè)未分析的keyword類型字段绘闷,它可以使用doc_values數(shù)據(jù)結(jié)構(gòu)來進(jìn)行聚合等操作橡庞,示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"my_field": {
"type": "text", //1
"fields": {
"keyword": { //2
"type": "keyword"
}
}
}
}
}
}
注釋1:使用my_field字段來進(jìn)行全文搜索。
注釋2:使用my_field.keyword字段來進(jìn)行聚合印蔗、排序或在腳本中使用毙死。
fields
- fields參數(shù)用于提供多字段。使得字段具有多種類型的功能喻鳄。fields不會(huì)修改原始字段_source的值扼倘。
- 操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
PUT my_index_01/_doc/1
{"city":"New York"}
PUT my_index_01/_doc/2
{"city":"York"}
GET my_index_01/_search
{
"query": {
"match": {
"city": "york"
}
},
"sort": {
"city.raw": "asc"
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw"
}
}
}
}
- 多字段用于多分析器,示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"text": { //1
"type": "text",
"fields": {
"english": { //2
"type": "text",
"analyzer": "english"
}
}
}
}
}
}
PUT my_index_01/_doc/1
{ "text": "quick brown fox" }
PUT my_index_01/_doc/2
{ "text": "quick brown foxes" }
GET my_index_01/_search
{
"query": {
"multi_match": {
"query": "quick brown foxes",
"fields": [ //3
"text",
"text.english"
],
"type": "most_fields" //3
}
}
}
注釋1:text字段使用standard分析器除呵。
注釋2:text.english字段使用english分析器再菊。
注釋3:通過text和text.english字段合并得分。
format
- 通過format參數(shù)設(shè)置日期格式颜曾,參數(shù)值需要符合日期格式語法纠拔。自定義格式操作如下:
PUT my_index_01
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
- 支持日期格式語法包括但不限以下這些:
(1)epoch_millis:long類型整數(shù),表示自紀(jì)元以來的毫秒數(shù)
(2)epoch_second:long類型整數(shù)泛豪,表示自紀(jì)元以來的秒數(shù)
(3)date_optional_time or strict_date_optional_time:形式如
yyyy-MM-dd'T'HH:mm:ss.SSSZ 或yyyy-MM-dd稠诲。
(4)strict_date_optional_time_nanos:形式如
yyyy-MM-dd 'HH: mm: ss。SSSSSSZ或yyyy-MM-dd诡曙。
(5)basic_date:形式如yyyyMMdd臀叙。
(6)basic_date_time:形式如yyyyMMdd'T'HHmmss.SSSZ。
(7)basic_date_time_no_millis:形式如yyyyMMdd'T'HHmmssZ价卤。
(8)basic_ordinal_date:形式如yyyyDDD劝萤。
(9)basic_ordinal_date_time:形式如yyyyDDD'T'HHmmss.SSSZ。
(10)basic_time:HHmmss.SSSZ慎璧。
(11)basic_time_no_millis:HHmmssZ床嫌。
(12)basic_t_time:'T'HHmmss.SSSZ。
更多參考官方文檔
ignore_above
- 字段的字符串長度超過ignore_above參數(shù)設(shè)置的值將不會(huì)被索引或存儲(chǔ)胸私。對(duì)于字符串?dāng)?shù)組厌处,ignore_above將分別應(yīng)用于每個(gè)數(shù)組元素,長度超過ignore_above值的字符串元素將不會(huì)被索引或存儲(chǔ)岁疼,但是在_source字段中仍然會(huì)存在此元素阔涉。操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"message": {
"type": "keyword",
"ignore_above": 20
}
}
}
}
PUT my_index_01/_doc/1
{"message":"Syntax error"}
PUT my_index_01/_doc/2
{"message":"Syntax error with some long stacktrace"} //1
注釋1:該文檔將被索引,由于長度超過設(shè)置值,不會(huì)索引message字段
ignore_malformed
- 如果在字段中索引錯(cuò)誤的數(shù)據(jù)類型洒敏,默認(rèn)情況下會(huì)拋出異常,并拒絕整個(gè)文檔疙驾。ignore_malform參數(shù)如果設(shè)置為真凶伙,則允許忽略異常,格式不正確的字段沒有索引它碎,但是文檔中的其他字段會(huì)正常處理函荣。操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"number_one": {
"type": "integer",
"ignore_malformed": true
},
"number_two": {
"type": "integer"
}
}
}
}
# 文檔能索引成功,忽略number_one字段的值
PUT my_index_01/_doc/1
{"text":"Some text value","number_one":"foo"}
# 直接拒絕扳肛,拋出異常
PUT my_index_01/_doc/2
{"text":"Some text value","number_two":"foo"}
- index.mapping.ignore_malform可在索引級(jí)別上設(shè)置傻挂。用來在所有允許的類型上全局忽略格式不正確的內(nèi)容。此外挖息,索引級(jí)別的設(shè)置會(huì)被類型級(jí)別的設(shè)置覆蓋金拒。操作示例如下:
PUT my_index_01
{
"settings": {
"index.mapping.ignore_malformed": true
},
"mappings": {
"properties": {
"number_one": {
"type": "byte"
},
"number_two": {
"type": "integer",
"ignore_malformed": false
}
}
}
}
index
- index參數(shù)控制字段值是否被索引。它接受true或false套腹,默認(rèn)為true绪抛。沒有索引的字段是不可查詢的。該參數(shù)與enabled參數(shù)有一定區(qū)別:
(1)enabled參數(shù)只作用與object字段或頂級(jí)mapping中电禀,如果設(shè)置了enabled為false幢码,那么不能同時(shí)設(shè)置store為true。
(2)index參數(shù)作用于其他類型字段尖飞,并且可以和store參數(shù)同時(shí)使用症副。 - 禁用字段index操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"text": {
"type": "text",
"index": false
}
}
}
}
index_options
- index_options參數(shù)控制將哪些信息添加到倒排索引中,用于搜索和高亮顯示政基。
- index_options參數(shù)僅用于text字段贞铣。
- index_options參數(shù)接受下列值:
(1)docs:只有文檔編號(hào)被索引。
(2)freqs:文檔編號(hào)和詞條頻率(詞條出現(xiàn)次數(shù))被索引沮明。詞頻用于給重復(fù)詞評(píng)分高于單個(gè)詞評(píng)分咕娄。
(3)positions (默認(rèn)):文檔編號(hào)、詞條頻率和詞條位置(或順序)被索引珊擂。位置可用于鄰近度或短語查詢圣勒。
(4)offsets:對(duì)文檔編號(hào)、詞條頻率摧扇、位置以及開始和結(jié)束字符偏移量(將詞條映射回原始字符串)進(jìn)行索引圣贸。統(tǒng)一高亮器使用偏移量來加快高亮的速度。 - 操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"text": {
"type": "text",
"index_options": "offsets"
}
}
}
}
PUT my_index_01/_doc/1
{"text":"Quick brown fox"}
GET my_index_01/_search
{
"query": {
"match": {
"text": "brown fox"
}
},
"highlight": {
"fields": {
"text": {}
}
}
}
index_phrases
- index_phrases如果被啟用扛稽,則將兩個(gè)詞條的單詞組合編入一個(gè)單獨(dú)的字段吁峻。這允許精確短語查詢更高效地運(yùn)行,但以更大的索引為代價(jià)。注意用含,當(dāng)停用詞沒有被刪除時(shí)矮慕,這種方法的效果最好,因?yàn)榘S迷~的短語將不會(huì)使用子字段啄骇,并且會(huì)退回到標(biāo)準(zhǔn)短語查詢痴鳄。該參數(shù)接受true或false(默認(rèn))。示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"text": {
"type": "text",
"index_phrases": "true"
}
}
}
}
index_prefixes
- index_prefixes參數(shù)允許對(duì)詞條前綴進(jìn)行索引缸夹,以加速前綴搜索痪寻。它接受以下可選設(shè)置:
(1)min_chars:索引的最小前綴長度(包含)。必須大于0虽惭,默認(rèn)值為2橡类。
(2)max_chars:索引的最大前綴長度(包含)。必須小于20芽唇,默認(rèn)值為5顾画。
操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"full_name": {
"type": "text",
"index_prefixes": {
"min_chars" : 1,
"max_chars" : 10
}
}
}
}
}
meta
- meta參數(shù)設(shè)置附加到字段的元數(shù)據(jù)。這個(gè)元數(shù)據(jù)對(duì)Elasticsearch來說是不透明的匆笤,它既不會(huì)存儲(chǔ)于_source字段亲雪,也不會(huì)用于搜索、排序等操作疚膊,它只對(duì)在相同索引上工作的多個(gè)應(yīng)用程序有用义辕,以共享關(guān)于字段的元信息。操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"latency": {
"type": "long",
"meta": {
"unit": "ms"
}
}
}
}
}
normalizer
- normalizer歸一化器作用于keyword字段寓盗,常在以下情況使用:
(1)對(duì)keyword字段進(jìn)行索引之前灌砖。
(2)通過查詢解析器(如match查詢)搜索keyword字段時(shí)。
(3)通過詞條級(jí)查詢(如term查詢)搜索keyword字段傀蚌。
操作示例如下:
PUT my_index_01
{
"settings": {
"analysis": {
"normalizer": {
"my_normalizer": { //1
"type": "custom",
"char_filter": [],
"filter": ["lowercase", "asciifolding"]
}
}
}
},
"mappings": {
"properties": {
"foo": {
"type": "keyword",
"normalizer": "my_normalizer"
}
}
}
}
PUT my_index_01/_doc/1
{"foo":"BàR"} //2
PUT my_index_01/_doc/2
{"foo":"bar"} //2
POST my_index_01/_refresh
GET my_index_01/_search
{"query":{"term":{"foo":"BAR"}}} //2
GET my_index_01/_search
{"query":{"match":{"foo":"BAR"}}} //2
注釋1:自定義歸一化器基显,其過濾器使用lowercase(轉(zhuǎn)換為小寫)和asciifolding(轉(zhuǎn)換ascii編碼格式字體)
注釋2:索引和查詢時(shí),BàR善炫、BAR都會(huì)轉(zhuǎn)換為bar撩幽。
norms
- norms存儲(chǔ)各種各樣的歸一化因子,在后續(xù)查詢時(shí)使用箩艺,以便計(jì)算一個(gè)查詢的文檔相關(guān)性得分窜醉。
- 雖然norms對(duì)于評(píng)分很有用,但它也需要大量的磁盤空間艺谆。因此榨惰,如果不需要在某個(gè)特定領(lǐng)域計(jì)算得分,應(yīng)該禁用該領(lǐng)域的norms(默認(rèn)禁用)静汤,特別是僅用于過濾或聚合的字段琅催。禁用norms操作如下:
PUT my_index_01/_mapping
{
"properties": {
"title": {
"type": "text",
"norms": false
}
}
}
- 禁用后居凶,歸一化因子不會(huì)立即被刪除,但是當(dāng)繼續(xù)索引新的文檔時(shí)藤抡,舊的分段會(huì)被合并成新的分段侠碧,歸一化因子就會(huì)被刪除。在歸一化因子被刪除的字段上的任何分?jǐn)?shù)計(jì)算都可能返回不一致的結(jié)果缠黍,因?yàn)橐恍┪臋n不再有歸一化因子弄兜,而其他文檔可能仍然有歸一化因子。
null_value
- 一個(gè)null值不能被索引或搜索嫁佳。當(dāng)一個(gè)字段被設(shè)置為null(或一個(gè)空數(shù)組或一個(gè)空值數(shù)組)時(shí),該字段被視為沒有值谷暮。
- null_value參數(shù)默認(rèn)值為null蒿往,可以指定值來替換顯式的空值,以便對(duì)其進(jìn)行索引和搜索湿弦。操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL" //1
}
}
}
}
PUT my_index_01/_doc/1
{"status_code":null}
PUT my_index_01/_doc/2
{"status_code":[null]}
GET my_index_01/_search
{"query":{"term":{"status_code":"NULL"}}} //2
注釋1:null值被替換為字符串NULL
注釋2:文檔1和文檔2包括null值或null值元素瓤漏,所以全部查詢出來
- null_value指定值不會(huì)修改_source字段的內(nèi)容。
position_increment_gap
文本字段在分析時(shí)會(huì)考慮詞條的位置颊埃,以便能夠支持鄰近或短語查詢蔬充。當(dāng)索引具有多個(gè)值的文本字段時(shí),在值之間添加一個(gè)“假”間隙班利,以防止大多數(shù)短語查詢?cè)谥抵g匹配饥漫。這個(gè)間隙的大小使用position_increment_gap配置,默認(rèn)值為100罗标。
PUT my_index_01/_doc/1
{"names":["John Abraham","Lincoln Smith"]}
GET my_index_01/_search //1
{
"query": {
"match_phrase": {
"names": {
"query": "Abraham Lincoln"
}
}
}
}
GET my_index_01/_search //2
{
"query": {
"match_phrase": {
"names": {
"query": "Abraham Lincoln",
"slop": 101
}
}
}
}
注釋1:此短語查詢與文檔不匹配庸队,查無匹配數(shù)據(jù)
注釋2:此短語查詢匹配文檔,即使Abraham和Lincoln在不同的字符串中闯割,因?yàn)閟lop > position_increment_gap彻消,slop參數(shù)告訴match_phrase查詢?cè)~條能夠相隔多少空隙時(shí)仍然將文檔視為匹配。
- 可以修改參數(shù)position_increment_gap的值宙拉,示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"names": {
"type": "text",
"position_increment_gap": 0
}
}
}
}
properties
- 類型映射宾尚、object字段和nested字段包含的子字段稱為屬性(properties)。這些屬性可以是任何數(shù)據(jù)類型谢澈,包括object和nested煌贴。屬性可以在通過下列方式添加:
(1)通過在創(chuàng)建索引時(shí)顯式地定義它們。
(2)通過在使用PUT Mapping API添加或更新映射類型時(shí)顯式地定義它們锥忿。
(3)動(dòng)態(tài)地索引包含新字段的文檔崔步。 - 創(chuàng)建索引時(shí)顯式地定義示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"manager": {
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
},
"employees": {
"type": "nested",
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
}
}
}
}
similarity
- similarity相似度用于配置每個(gè)字段的評(píng)分算法或相似度算法。默認(rèn)的評(píng)分算法是BM25缎谷。
- similarity參數(shù)主要用于文本字段井濒,但也可以應(yīng)用于其他字段類型灶似。
- similarity參數(shù)支持的配置值有BM25和boolean(布爾相似性會(huì)給詞條一個(gè)與查詢boost相等的分?jǐn)?shù))∪鹉悖可以字段的similarity配置酪惭,示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"default_field": {
"type": "text"
},
"boolean_sim_field": {
"type": "text",
"similarity": "boolean"
}
}
}
}
store
- 默認(rèn)情況下,字段值被索引以使其可搜索者甲,但不會(huì)被存儲(chǔ)春感。這意味著可以查詢字段,但不能檢索原始字段值虏缸。通常這并不重要鲫懒。字段值已經(jīng)是_source字段的一部分,該字段默認(rèn)存儲(chǔ)刽辙。 如果您只想檢索單個(gè)字段或幾個(gè)字段的值窥岩,而不是整個(gè)_source的值,則可以使用source filtering來實(shí)現(xiàn)宰缤。
- 在某些情況下颂翼,文本的內(nèi)容可能過大,我們不想將所有文本內(nèi)容存儲(chǔ)在_source字段慨灭,但有些字段內(nèi)容又希望能被查找到朦乏,在這種情況下,可以使用store參數(shù)氧骤。例如呻疹,如果有一個(gè)有標(biāo)題的文檔,一個(gè)日期筹陵,和一個(gè)非常大的內(nèi)容字段诲宇,我們只想要獲取標(biāo)題和日期內(nèi)容,但又不想要內(nèi)容字段惶翻,操作示例如下:
PUT my_index_01
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"title": {
"type": "text",
"store": true
},
"date": {
"type": "date",
"store": true
},
"content": {
"type": "text"
}
}
}
}
PUT my_index_01/_doc/1
{
"title": "Some short title",
"date": "2015-01-01",
"content": "A very long content field..."
}
GET my_index_01/_search
{
"stored_fields": [
"title",
"date"
],
"query": {
"match": {
"content": "content"
}
}
}
term_vector
- 詞條向量包含著分析過程中產(chǎn)生的詞條的相關(guān)信息姑蓝,這些信息包括:
(1)詞條列表。
(2)每一個(gè)詞條的位置(或順序)吕粗。
(3)將詞條映射到其所在的原始字符串中的開始和結(jié)束字符偏移量纺荧。
(4)可用的有效載荷—用戶定義的與每個(gè)詞條位置相關(guān)聯(lián)的二進(jìn)制數(shù)據(jù)。 - 詞條向量可以被存儲(chǔ)颅筋,以便能對(duì)特定文檔檢索它們宙暇。
- term_vector參數(shù)支持以下配置值:
(1)no:不存儲(chǔ)詞條向量(默認(rèn))。
(2)yes:只存儲(chǔ)字段中的詞條议泵。
(3)with_positions:存儲(chǔ)詞條和位置占贫。
(4)with_offsets:存儲(chǔ)詞條和字符偏移量。
(5)with_positions_offsets:存儲(chǔ)詞條先口、位置和字符偏移量型奥。
(6)with_positions_payloads:存儲(chǔ)詞條瞳收、位置和有效載荷。
(7)with_positions_offsets_payloads:存儲(chǔ)詞條厢汹、位置螟深、偏移量和有效載荷。 - term_vector參數(shù)設(shè)置操作示例如下:
PUT my_index_01
{
"mappings": {
"properties": {
"text": {
"type": "text",
"term_vector": "with_positions_offsets"
}
}
}
}
PUT my_index_01/_doc/1
{"text":"Quick brown fox"}
結(jié)語
至此烫葬,本文對(duì)Elasticsearch Mapping中常用且重要的參數(shù)已做了一個(gè)基本大致介紹界弧,后續(xù)有時(shí)間會(huì)進(jìn)一步分析并介紹映射參數(shù)的作用及其底層原理。