1. mapping
類似于數(shù)據(jù)庫(kù)的schema的定義,mapping會(huì)把文檔映射成lucene需要的扁平格式,一個(gè)mapping屬于一個(gè)索引的type,一個(gè)type中有一個(gè)mapping定義,7.0后一個(gè)索引只有一個(gè)type,所以不需要在mapping中定義type的信息。作用如下:
- 定義索引這里面的字段和名稱
- 定義字段的數(shù)據(jù)類型,字符串、布爾、數(shù)字......
- 字段,倒排索引相關(guān)的配置,是否分詞。
1.1 字段的類型
- 簡(jiǎn)單類型
text/keyword,Date,Integer/Floating,Boolean,IPv4 &IPv6 - 復(fù)雜類型
對(duì)象類型/嵌套類型 - 特殊類型
geo_point & geo_shape/percolator(地理信息) - 數(shù)組類型
ES不提供專門的數(shù)組類型,任何字段都可以包含多個(gè)相同類型的數(shù)值
2.Dynamic Mapping
寫入文檔的時(shí)候,索引不存在,會(huì)自動(dòng)創(chuàng)建索引, 無(wú)需手動(dòng)創(chuàng)建,ES會(huì)根據(jù)內(nèi)容推斷字段的類型,推斷會(huì)不準(zhǔn)確,可能造成某些功能無(wú)法使用,例如 范圍查詢。
查看一個(gè)索引當(dāng)前的mapping
GET /movies/_mapping
{
"movies" : {
"mappings" : {
"properties" : {
"@version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"genre" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"year" : {
"type" : "long"
}
}
}
}
}
類型的自動(dòng)識(shí)別關(guān)系:
| JSON類型 | Elasticsearch |
|---|---|
| 字符串 | 匹配日期格式,設(shè)置為date;匹配數(shù)字,設(shè)置為float或者long,功能默認(rèn)關(guān)閉;設(shè)置為text,并增加keyword子字段。 |
| 布爾值 | boolean |
| 浮點(diǎn)數(shù) | float |
| 整數(shù) | long |
| 對(duì)象 | object |
| 數(shù)組 | 由第一個(gè)非空數(shù)值的類型決定 |
| 空值 | 忽略 |
測(cè)試
PUT mapping_test/_doc/1
{
"uid":1,
"is_vip":false,
"user_name":"wang",
"info":{
"address":"地址信息",
"card":"picture.png"
}
}
獲取查看信息 GET /mapping_test/_mapping
{
"mapping_test" : {
"mappings" : {
"properties" : {
"info" : {
"properties" : {
"address" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"card" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"is_vip" : {
"type" : "boolean"
},
"uid" : {
"type" : "long"
},
"user_name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
3.修改Mapping的字段類型
- 新增字段
- dynamic設(shè)置為true,一旦有新增字段的文檔寫入,mapping也同時(shí)被更新。
- dynamic設(shè)置為false,mapping不會(huì)被更新,新增的字段數(shù)據(jù)無(wú)法被索引,但是信息會(huì)出現(xiàn)在source中.
- dynamic設(shè)置為strict,文檔寫入失敗
- 已有的字段,一旦有數(shù)據(jù)寫入,不支持修改(倒排索引不支持修改)
- 希望更改字段類型,用
Reindex API,重建索引
設(shè)計(jì)原因 - 如果修改字段數(shù)據(jù)類型,會(huì)導(dǎo)致已經(jīng)被索引的文檔不能被搜索。
- 新增字段不存在影響。
POST mapping_test2/_doc
{
"field":"one"
}
GET mapping_test2/_search
{
"query": {
"match": {
"field": "one"
}
}
}
PUT mapping_test2/_mapping
{
"dynamic":"false"
}
POST mapping_test2/_doc
{
"field_2":"two"
}
//
GET mapping_test2/_search
{
"query": {
"match": {
"field_2": "two"
}
}
}
//但是可以查出來(lái)
GET mapping_test2/_search
POST mapping_test2/_doc
{
"field_2":"three",
"field":"3"
}
//但是根據(jù)field字段可以查出來(lái)
GET mapping_test2/_search
{
"query": {
"match": {
"field": "3"
}
}
}
4. 顯示的設(shè)置mapping信息
顯示的設(shè)置mapping可以更靈活控制ES。
根據(jù)API手冊(cè),手寫,減少出錯(cuò)概率的方法。
- 創(chuàng)建一個(gè)臨時(shí)的index,寫入一些樣本數(shù)據(jù)
- 通過(guò)mapping api獲得該臨時(shí)文件的動(dòng)態(tài)mapping定義
- 修改后用,使用該配置創(chuàng)建索引
- 刪除臨時(shí)索引
4.1 控制字段是否被index
index的選項(xiàng)配置
- docs:記錄doc id
- freqs:記錄doc id和term的頻次
- position: 記錄doc id、term頻次、term位置
- offsets:doc id、term頻次、term位置、字符串的偏移量
text類型默認(rèn)是positions,其他的默認(rèn)為docs,記錄內(nèi)容越多,占據(jù)空間越大
例如創(chuàng)建mapping,字段名為user_name,字符串類型。不需要索引,info字段的倒排索引類型為positions。
PUT mapping_test3
{
"mappings": {
"properties": {
"user_name":{
"index": false,
"type": "text"
},
"info":{
"index_options": "positions",
"type": "text"
}
}
}
}
4.2 null_value
對(duì)Null值進(jìn)行搜索,可以通過(guò)keyword類型的字段設(shè)置null_value。
"mobile":{
"type":"keyword",
"null_value":"NULL"
}
就可以對(duì)NULL搜索:GET users/_search?q=mobile:NULL
4.3 copy_to
- 用來(lái)滿足一些搜索需要,類似于數(shù)據(jù)庫(kù)
title like "%a%" or title2 like "%a%" - copy_to的字段不會(huì)出現(xiàn)在_source里面
PUT users
{
"mappings": {
"properties": {
"first_name":{
"type": "text",
"copy_to": "full_name"
},
"last_name":{
"type": "text",
"copy_to": "full_name"
}
}
}
}
就可以在支持 :GET users/_search?q=full_name:(zhang san)搜索。