上一篇主要講解什么是 URL Search 和 Request Body Search 的語法买优。本篇對(duì) Mapping 的 Dynamic Mapping 以及手動(dòng)創(chuàng)建 Mapping 進(jìn)行講解。
1.什么是 Mapping
- Mapping 類似數(shù)據(jù)庫(kù)中的 schema 的定義你踩,作用如下
- 定義索引中的字段的名稱
- 定義字段的數(shù)據(jù)類型孤钦,例如字符串,數(shù)值等
- 字段,倒排索引的相關(guān)配置拣技,比如可以通過配置字段是否需要被索引(Analyzed or Not Analyzed,Analyzer)
- Mapping 會(huì)把 Json 文檔映射成 Lucene 所需要的扁平格式
- 一個(gè) Mapping 屬于一個(gè)索引的 Type,在 7.0 之后版本一個(gè)索引只有一個(gè) Type(_doc)
- 一個(gè) Type 有一個(gè) Mapping 定義
- 7.0 開始耍目,不需要在 Mapping 定義中指定 type 信息
2.常用字段的數(shù)據(jù)類型
- 簡(jiǎn)單類型
- Text / Keyword
- Date
- Integer / float/ double /long
- Boolean
- Ip
- 復(fù)雜類型-對(duì)象和嵌套對(duì)象
- 對(duì)象類型/嵌套類型
- 特殊類型(針對(duì)地理信息的有特殊處理)
- geo_point & geo_shape / percolator
3.1什么是 Dynamic Mapping
Dynamic Mapping 會(huì)自動(dòng)根據(jù)文檔信息膏斤,推算出字段的類型,使得你無需手動(dòng)創(chuàng)建 Mapping邪驮。在寫入文檔時(shí)候莫辨,而且如果索引不存在,會(huì)自動(dòng)創(chuàng)建索引。但是有時(shí)候推算也會(huì)錯(cuò)誤沮榜,例如地理位置信息盘榨。當(dāng)類型如果設(shè)置不對(duì)時(shí),會(huì)導(dǎo)致一些功能無法正常運(yùn)行蟆融,這點(diǎn)要特別注意草巡。
下面總結(jié) Json 類型到 Elasticsearch 類型的自動(dòng)識(shí)別
3.2.Json 類型和 Elasticsearch 類型轉(zhuǎn)換映射
Json 類型 | Elasticsearch 類型 |
---|---|
字符串 | 1.匹配日期格式,轉(zhuǎn)為 Date 2.數(shù)值轉(zhuǎn)為 float 或者 long,默認(rèn)關(guān)閉 3.轉(zhuǎn)為 Text型酥,并且增加 keyword |
布爾值 | boolean |
浮點(diǎn)數(shù) | float |
整 數(shù) | long |
對(duì) 象 | Object |
數(shù) 組 | 由第一個(gè)非空數(shù)值的類型所決定 |
空 值 | 忽略 |
PUT mapping_test/_doc/1
{
"name":"al",
"age":15,
"ageStr":"15",
"birth":"2019-12-18",
"arg":["aaa","1"],
"flag":false
}
GET mapping_test/_mapping
3.3.能否更改 Mapping 字段類型
- 新增字段情況山憨,Dynamic 設(shè)置為 true,帶有新字段的文檔寫入弥喉,Mapping 會(huì)更新萍歉。Dynamic 設(shè)置為 false,Mapping 不被更新档桃,新增字段不會(huì)被索引枪孩。Dynamic 設(shè)置為 Strict,帶有新字段的文檔寫入會(huì)直接報(bào)錯(cuò)藻肄。
- 對(duì)已有字段并且存在數(shù)據(jù)情況蔑舞,不支持修改字段定義,因?yàn)?ES 通過 Lucene 生成倒排索引嘹屯,一旦生成就不許與修改
- 如果實(shí)在需要修改可以通過 Reindex Api 重建索引
PUT mapping_test/_mapping
{
"dynamic":"false"
}
PUT mapping_test/_doc/2
{
"name":"al",
"age":15,
"ageStr":"15",
"birth":"2019-12-18",
"arg":["aaa","1"],
"flag":false,
"addCol":"test"
}
GET mapping_test/_search
{
"query": {
"match": {
"addCol": "test"
}
}
}
當(dāng)前設(shè)置 "dynamic":"false"時(shí)攻询,新增的字段查詢不出結(jié)果。
4.1.手動(dòng)創(chuàng)建 Mapping
上面我們介紹了關(guān)于 Dynamic Mapping 功能州弟,現(xiàn)在但我們想要手動(dòng)創(chuàng)建一個(gè) Mapping 該如何創(chuàng)建钧栖。我先看一下下面代碼。
PUT student
{
"mappings":{
"properties": {
"firstName":{
"type":"text"
},
"lastName":{
"type":"text"
},
"password":{
"type":"text",
"index":false
}
}
}
}
PUT student/_doc/1
{
"firstName":"AA",
"lastName":"BB",
"password":"abc"
}
POST student/_search
{
"query": {
"match_phrase": {
"password": {
"query": "abc"
}
}
}
}
上面這個(gè)例子婆翔,就是一個(gè)比較簡(jiǎn)單手動(dòng)創(chuàng)建例子拯杠,我們通過為每一個(gè)字段創(chuàng)建類型,當(dāng)指定 index:false 時(shí)啃奴,ES 將不對(duì)這個(gè)字段建立倒排索引潭陪,從上圖結(jié)果就可以看出。
4.2.Index Options
ES 有四種不同級(jí)別的 Index Options 配置
- docs 記錄 doc id
- freqs 記錄 doc id 和 term 頻次
- positions 記錄 doc id 和 term 頻次 和 term 位置
- offsets 記錄 doc id 和 term 頻次 和 term 位置和字符偏移量
Text 類型默認(rèn) positions最蕾,其他默認(rèn)為 docs
4.3.copy_to
copy_to 是為瞞足一些特定搜素需求依溯,將多個(gè)字段 數(shù)值拷貝到目標(biāo)字段,目標(biāo)字段不會(huì)出現(xiàn)在 _source瘟则。在 ES7 中黎炉,copy_to 已經(jīng)替代 copy_to。例如下面這個(gè)例子醋拧,把 firsetName 和 lastName 合并一起搜素慷嗜。
PUT student_1
{
"mappings":{
"properties": {
"firstName":{
"type":"text",
"copy_to": "fullName"
},
"lastName":{
"type":"text",
"copy_to": "fullName"
},
"password":{
"type":"text",
"index":false
}
}
}
}
PUT student_1/_doc/1
{
"firstName":"AA",
"lastName":"BB",
"password":"abc"
}
Get student_1/_search?q=fullName:(AA BB)
5.小結(jié)
本篇主要對(duì) Dynamic Mapping 以及手動(dòng)創(chuàng)建 Mapping 進(jìn)行講解宿百,Dynamic Mapping 有好處也有壞處,好處我們無需定義 Mapping洪添,壞處是推算的類型不一定正確,這點(diǎn)要留意雀费。如果手動(dòng)創(chuàng)建 Mapping 比較推薦先用 Dynamic Mapping 創(chuàng)建生成一個(gè)臨時(shí)索引干奢,查詢 Mapping 定義(標(biāo)題3.2 下面的結(jié)果圖)修改使用,這樣可以減少工作量和出錯(cuò)的概率盏袄。
系列文章
【Elasticsearch 7 探索之路】(五)搜索相關(guān) Search-API
【Elasticsearch 7 探索之路】(四)Analyzer 分析
【Elasticsearch 7 探索之路】(三)倒排索引
【Elasticsearch 7 探索之路】(二)文檔的 CRUD 和批量操作
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch忿峻?