Elasticsearch系列(7)Mapping之參數(shù)

前言

映射參數(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ù)的作用及其底層原理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搭综,一起剝皮案震驚了整個(gè)濱河市垢箕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兑巾,老刑警劉巖条获,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闪朱,居然都是意外死亡月匣,警方通過查閱死者的電腦和手機(jī)钻洒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門奋姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人素标,你說我怎么就攤上這事称诗。” “怎么了头遭?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵寓免,是天一觀的道長。 經(jīng)常有香客問我计维,道長袜香,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任鲫惶,我火速辦了婚禮蜈首,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欠母。我一直安慰自己欢策,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布赏淌。 她就那樣靜靜地躺著踩寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪六水。 梳的紋絲不亂的頭發(fā)上俺孙,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天辣卒,我揣著相機(jī)與錄音,去河邊找鬼鼠冕。 笑死添寺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懈费。 我是一名探鬼主播计露,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼憎乙!你這毒婦竟也來了票罐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤泞边,失蹤者是張志新(化名)和其女友劉穎该押,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阵谚,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚕礼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梢什。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奠蹬。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嗡午,靈堂內(nèi)的尸體忽然破棺而出囤躁,到底是詐尸還是另有隱情,我是刑警寧澤荔睹,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布狸演,位于F島的核電站,受9級(jí)特大地震影響僻他,放射性物質(zhì)發(fā)生泄漏宵距。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一吨拗、第九天 我趴在偏房一處隱蔽的房頂上張望满哪。 院中可真熱鬧,春花似錦丢胚、人聲如沸翩瓜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔跌。三九已至,卻和暖如春峡蟋,著一層夾襖步出監(jiān)牢的瞬間坟桅,已是汗流浹背华望。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仅乓,地道東北人赖舟。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像夸楣,于是被迫代替她去往敵國和親宾抓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344