ElasticSearch核心之——Mapping設(shè)置

前言

我們知道古瓤,我們是在ElasticSearch(簡(jiǎn)稱ES)上創(chuàng)建索引文檔后止剖,哪怕我們之前沒有指定字段的類型,但ES還是會(huì)給我們的文檔數(shù)據(jù)給予相對(duì)應(yīng)的字段屬性落君,這背后是什么原理呢穿香?同時(shí),ES中又提供了哪些常見的數(shù)據(jù)類型給我們使用呢绎速?是否可以自定義Mapping模板來方便自己使用呢皮获?本篇文章將圍繞ES的Mapping配置來對(duì)上面的問題進(jìn)行一一解答,希望可以對(duì)這方面不熟悉的讀者一個(gè)參考纹冤。

注意:文章中的演示版本為Elastic Search7.6.1洒宝,具體的語法各位讀者以自己本地的es版本為準(zhǔn)

一、Mapping簡(jiǎn)介

Mapping類似于數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)定義赵哲,我們可以通過它來定義Index下的字段名(Field Name )、定義字段的類型君丁,比如數(shù)值型枫夺、字符串型、布爾型等绘闷、定義倒排索引相關(guān)的配置橡庞,比如是否索引、記錄position等

PUT /mapping_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}
Mapping入門

二印蔗、自定義Mapping的API介紹

(一)Dynamic 新增字段嚴(yán)格性

Mappings的API介紹如下:


Mappings的API介紹

Mapping 中的字段類型一旦設(shè)定后扒最,禁止直接修改,因?yàn)長(zhǎng)ucene實(shí)現(xiàn)的倒排索引生成后不允許修改华嘹。原因也很好理解吧趣,如果可以隨意更改字段類型的話,會(huì)影響倒排索引的使用耙厚,試想一下强挫,如果一個(gè)字段原先是text類型,如果變更成keyword類型的話薛躬,原先已有的倒排索引就要重新reindex后才能繼續(xù)使用俯渤。

但是ES允許我們對(duì)已有的索引進(jìn)行新增字段的操作,具體的實(shí)現(xiàn)方式是通過dynamic參數(shù)來定義的型宝。

dynamic-value 含義
true(默認(rèn)) 允許自動(dòng)新增字段
false 不允許自動(dòng)新增字段八匠,但是文檔可以正常寫入絮爷,但無法對(duì)字段進(jìn)行查詢等操作
strict 文檔不能寫入,報(bào)錯(cuò)
新增不存在的文檔字段
通過hobby字段進(jìn)行查詢
dynamic定義為嚴(yán)格模式
(二)copy_to 字段復(fù)制

copy_to 可以將該字段的值復(fù)制到目標(biāo)字段梨树,實(shí)現(xiàn)類似于_all的作用


PUT /mapping_index
{
  "mappings": {
    "properties": {
      "lastname": {
        "type": "text",
        "copy_to": "fullname"
      },
      "firstname": {
        "type": "text",
        "copy_to": "fullname"
      },
      "fullname": {
        "type": "text"
      }
    }
  }
}

PUT /mapping_index/_doc/1
{
  "firstname": "xiaoming",
  "lastname": "huang"
}

GET /mapping_index/_search
copy_to案例

使用copy_to的字段來作為檢索條件
(三)index 控制字段是否可以索引

index控制當(dāng)前字段是否索引坑夯,默認(rèn)為true,即記錄索引劝萤,false 不記錄渊涝,即不可搜索

index測(cè)試案例

那么我們一般可以在什么場(chǎng)景使用index呢?
當(dāng)ES的索引中存在某些證件號(hào)等敏感信息我們不希望被用作索引條件的時(shí)候床嫌,我們就可以將這個(gè)字段的index屬性設(shè)為false跨释。同時(shí)該字段不作為倒排索引,會(huì)節(jié)省磁盤和內(nèi)存空間

(四)index_options

index_options控制倒排索引記錄的內(nèi)容厌处,一共有4種配置可選鳖谈。

index_options-value 含義
doc 只記錄文檔id(doc id
freqs 記錄doc idterm frequences
positions doc idterm frequencesterm position
offsets doc id缓淹、term frequences粪躬、term positioncharacter offsets

文本類型text默認(rèn)的配置是positions贯要,其他默認(rèn)是docs。需要注意的是椭住,雖然index_options提供了offsets這種內(nèi)容較多的配置級(jí)別崇渗,但是記錄的內(nèi)容越多,占用的空間也會(huì)越多京郑,在實(shí)際操作中還是要根據(jù)實(shí)際情況進(jìn)行配置宅广。

PUT /mapping_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "index_options": "offsets"
      }
    }
  }
}
index_options測(cè)試案例
(五)Null_Value

null_value是當(dāng)字段遇到null值時(shí)的處理策略,默認(rèn)為null些举,即空值跟狱,此時(shí)es 會(huì)忽略該值』海可以通過設(shè)定該值設(shè)定字段的默認(rèn)值


null_value測(cè)試樣例1
null_value測(cè)試樣例2

三驶臊、Mapping數(shù)據(jù)類型

Mapping中給存儲(chǔ)的數(shù)據(jù)提供了字段類型來描述字段的屬性(這部分比較簡(jiǎn)單,就不進(jìn)行演示了~)

(一)核心數(shù)據(jù)類型
類型 可選項(xiàng)
字符串型 text叼丑、keyword
數(shù)值型 tong资铡、integer、short幢码、byte.double笤休、float、half_float症副、scaled_float
日期類型 date
布爾類型 boolean
二進(jìn)制類型 binary
范圍類型 integer_range店雅、float_range政基、long_range、double_range闹啦、date_range
(二)復(fù)雜數(shù)據(jù)類型
類型 可選項(xiàng)
數(shù)組類型 array
對(duì)象類型 object
嵌套類型 nested object
(三)地理位置數(shù)據(jù)類型
類型 可選項(xiàng)
經(jīng)緯度查詢 geo_point
對(duì)象類型 object
地理形狀查詢 geo_shape
(四)專用類型
類型 可選項(xiàng)
實(shí)現(xiàn)自動(dòng)補(bǔ)全 completion
記錄分詞數(shù) token_count
記錄字符串 hash值 murmur3
(五)多字段特性:multi-fields

ES允許對(duì)同一個(gè)字段采用不同的配置沮明,比如分詞,常見例子如對(duì)人名實(shí)現(xiàn)拼音搜索窍奋,我們當(dāng)然可以在索引中新增一個(gè)字段荐健,單獨(dú)用于做人名的拼音,但是這樣拼音和人名就相互獨(dú)立開來了琳袄,缺少了關(guān)聯(lián)性江场,也不夠優(yōu)雅。通過Multi-Fields窖逗,我們只需要在人名中新增一個(gè)子字段為pinyin即可.

PUT /mapping_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "pinyin": {
            "type": "text",
            "analyzer": "pinyin"
          }
        }
      }
    }
  }
}
# 上面的拼音analyzer需要自己定義下
GET /mapping_index1/_search
{
  "query": {
    "match": {
      "username.pinyin": "xiaoming"
    }
  }
}

四址否、Dynamic Mapping 動(dòng)態(tài)映射模板定義

(一)ES的文檔字段的自動(dòng)識(shí)別

我們?cè)谑褂肊S的過程中可以發(fā)現(xiàn),哪怕我們?cè)趧?chuàng)建文檔或者新增索引字段的時(shí)候沒有聲明字段的數(shù)據(jù)類型碎紊,ES還是會(huì)幫我們定義好比較符合需要的數(shù)據(jù)類型佑附。


ES默認(rèn)給我們定義的文檔數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù)類型

那么ES是通過什么規(guī)則來進(jìn)行定義的呢?
答案是ES是依靠JSON文檔的字段類型來實(shí)現(xiàn)自動(dòng)識(shí)別字段類型的仗考,支持的類型如下:

JSON類型 ES數(shù)據(jù)類型
null 忽略
boolean boolean
浮點(diǎn)類型 float
整數(shù) long
object object
array 由第一個(gè)非null值的類型決定
string 配為日期則設(shè)為date類型(默認(rèn)開啟)音同;匹配為數(shù)字的話設(shè)為float或 long類型(默認(rèn)關(guān)閉)設(shè)為text類型,并附帶keyword的子字段
PUT /mapping_index/_doc/1
{
  "name": "小明",
  "age": 15,
  "birth": "1994-03-21",
  "married": false,
  "year": "15",
  "tags": ["boy","fashion"],
  "money": 100.3
}
測(cè)試ES默認(rèn)映射
  • 日期和數(shù)字的自動(dòng)識(shí)別

ES默認(rèn)的日期識(shí)別格式是:[ "strict_date_optional_time" ,"yyyy/MM/dd HH:mm:ss Zllyyyy/MM/dd z"]
strict_date_optional_time是ISo datetime的格式秃嗜,完整格式類似下面:
YYYY-MM-DDThh:mm:ssTzD (eg 1997-07-16T19:20:30+01:00)

我們可以通過dynamic_date_formatsdate_detection來實(shí)現(xiàn)可以自定義日期類型和關(guān)閉日期自動(dòng)識(shí)別的效果

PUT /mapping_index
{
 "mappings": {
   "dynamic_date_formats":  ["MM/dd/yyyy"]
 }
}
PUT /mapping_index/_doc/1
{
  "birth": "04/03/2021"
}
GET /mapping_index/_mapping
測(cè)試dynamic_date_formats
測(cè)試date_detection
(二)自定義字段映射模板

ElasticSearch允許根據(jù)es 自動(dòng)識(shí)別的數(shù)據(jù)類型权均、字段名等來動(dòng)態(tài)設(shè)定字段類型,可以實(shí)現(xiàn)所有字符串類型都默認(rèn)設(shè)定為keyword類型痪寻,即默認(rèn)不分詞螺句、所有以long_開頭的字段都設(shè)定為long類型虽惭,即實(shí)現(xiàn)指定字符模糊匹配指定數(shù)據(jù)類型橡类、所有自動(dòng)匹配為double類型的都設(shè)定為float類型等功能。

自定義映射字段的語法格式

匹配規(guī)則一般有以下三個(gè)參數(shù):

  1. match_mapping_type :匹配ES自動(dòng)識(shí)別的字段類型芽唇,比如boolean顾画、long、string等
  2. match匆笤,unmatch:匹配的字段名
  3. path_match研侣、path_unpath:匹配的路徑
ES默認(rèn)識(shí)別string
PUT /mapping_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "string_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}
測(cè)試match_mapping_type
PUT /mapping_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "string_as_keywords": {
          "match" : "message*",
          "mapping": {
            "type" : "keyword"
          }
        }
      }
    ]
  }
}

PUT /mapping_index/_doc/1
{
  "name": "xiaoming",
  "message": "he is a boy"
}
GET /mapping_index/_mapping
測(cè)試match
(三)自定義Mapping的建議

自定義Mapping雖然可以實(shí)現(xiàn)定制化開發(fā),但是當(dāng)索引中需要定義的字段很多時(shí)炮捧,工作量還是不少庶诡。針對(duì)這種情況,可以參考下面這種做法:

  1. 不先直接定義文檔Mapping映射咆课,而是寫入一條文檔到es的臨時(shí)索引中末誓,獲取es自動(dòng)生成的mapping
  2. 根據(jù)步驟1得到的mapping基礎(chǔ)上扯俱,再調(diào)整自定義相關(guān)配置
  3. 使用步驟2的mapping創(chuàng)建實(shí)際所需索引
(四)索引模板

索引模板,英文為Index Template喇澡,主要用于在新建索引時(shí)自動(dòng)應(yīng)用預(yù)先設(shè)定的配置迅栅,簡(jiǎn)化索引創(chuàng)建的操作步驟。當(dāng)需要配置的索引自定義映射數(shù)量較多晴玖,規(guī)則相同時(shí)读存,我們就可以考慮將這條索引映射規(guī)則抽離成索引模板。需要注意的是呕屎,當(dāng)有多套索引模板存在時(shí)让簿,會(huì)根據(jù)order設(shè)置,order大的覆蓋小的配置榨惰。

索引模板的API介紹

PUT /_template/template_1
{
  "index_patterns" : ["te*"],
  "order" : 0,
  "settings" : {
    "number_of_shards" : 1
  },
  "mappings" : {
    "_source" : { "enabled" : false }
  }
}

PUT /_template/template_2
{
  "index_patterns" : ["tes*"],
  "order" : 1,
  "settings" : {
    "number_of_shards" : 1
  },
  "mappings" : {
    "_source" : { "enabled" : true }
  }
}

PUT test_index

GET test_index
索引模板測(cè)試

刪除和獲取索引模板的API如下:

GET _template                 查詢所有索引模板
GET _template/模板名稱         查詢指定的索引模板
DELETE _template/模板名稱      刪除指定的索引模板

寫在最后

關(guān)于ES的Mapping映射還有其他知識(shí)點(diǎn)拜英,有需要查詢Mapping其他屬性的讀者可以自行查詢ES官方文檔(這一塊不同版本的ES還是略有不同的)。文檔地址如下:
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/indices-templates-v1.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琅催,一起剝皮案震驚了整個(gè)濱河市居凶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藤抡,老刑警劉巖侠碧,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缠黍,居然都是意外死亡弄兜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門瓷式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來替饿,“玉大人,你說我怎么就攤上這事贸典∈勇” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵廊驼,是天一觀的道長(zhǎng)据过。 經(jīng)常有香客問我,道長(zhǎng)妒挎,這世上最難降的妖魔是什么绳锅? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮酝掩,結(jié)果婚禮上鳞芙,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好原朝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布闯割。 她就那樣靜靜地躺著,像睡著了一般竿拆。 火紅的嫁衣襯著肌膚如雪宙拉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天丙笋,我揣著相機(jī)與錄音谢澈,去河邊找鬼。 笑死御板,一個(gè)胖子當(dāng)著我的面吹牛锥忿,可吹牛的內(nèi)容都是我干的笙各。 我是一名探鬼主播钉答,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼右蹦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晃洒,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刽锤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年碴卧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烫葬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒋歌,死狀恐怖府框,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布六水,位于F島的核電站荣茫,受9級(jí)特大地震影響想帅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一咧欣、第九天 我趴在偏房一處隱蔽的房頂上張望毛萌。 院中可真熱鬧狸演,春花似錦、人聲如沸宵距。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哨鸭。三九已至民宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間像鸡,已是汗流浹背活鹰。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留只估,地道東北人志群。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛔钙,于是被迫代替她去往敵國(guó)和親锌云。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容