本篇內(nèi)容主要講解“Mapping參數(shù)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Mapping參數(shù)有哪些”吧!
創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站建設(shè)、網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元通化做網(wǎng)站,已為上家服務(wù),為通化各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
Mapping 在 Elasticsearch 中的地位相當(dāng)于關(guān)系型數(shù)據(jù)庫中的 schema,它可以用來定義索引中字段的名字、定義字段的數(shù)據(jù)類型,還可以用來做一些字段的配置。從 Elasticsearch 7.0開始,Mapping 中不在乎需要定義 type 信息了,具體原因可以看官方的解釋。
我們剛剛提到 Mapping 中可以定義字段的數(shù)據(jù)類型,這可能是 Mapping 最常用的功能了,所以我們先來看看 Elasticsearch 都支持哪些數(shù)據(jù)類型。
Elasticsearch 支持的數(shù)據(jù)類型遠(yuǎn)不止這些,由于篇幅原因,這里就不一一列舉了。我找?guī)讉€工作中常見的來介紹一下。
首先就是字符串了,Elasticsearch 中的字符串有 text 和 keyword 兩種。其中 text 類型的字符串是可以被全文檢索的,它會被分詞器作用,
PUT my_index
{
"mappings": {
"properties": {
"full_name": {
"type": "text"
}
}
}
}
在設(shè)置字段類型為 text 時,還可以利用一些參數(shù)對這個字段進(jìn)行更進(jìn)一步的定制。
index
:標(biāo)記這個字段是否能被搜索,默認(rèn)是 true
search_analyzer
:被搜索時所使用的分詞器,默認(rèn)使用 setting 中設(shè)置的分詞器
fielddata
:字段是否允許在內(nèi)存中進(jìn)行排序、聚合,默認(rèn)是 false
meta
:關(guān)于字段的一些元數(shù)據(jù)
像一些id、郵箱、域名這樣的字段,我們就需要使用 keyword 類型了。因為 keyword 類型可以支持排序、聚合,并且只能支持精確查詢。
有些同學(xué)可能會把 ID 設(shè)置為數(shù)字類型,這也是沒問題的,數(shù)字類型和 keyword 各有各的好處,使用數(shù)字類型可以進(jìn)行范圍查找,而使用 keyword 類型則有更高的查詢效率。具體用哪種還要看使用場景。
日期類型在 Elasticsearch 中有三種表現(xiàn)形式
"2020-07-26"
和
"2015/01/01 12:10:30"
這樣的在 Elasticsearch 內(nèi)部,日期類型是以 long 類型的毫秒級時間戳存儲的,時區(qū)使用的是0時區(qū)。
我們可以自定義時間格式,默認(rèn)使用的是strict_date_optional_time||epoch_millis
「strict_date_optional_time_nanos」是通用的日期格式解析,至少要包含年份,如果要包含時間,則用T
分隔,例如yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ
或 yyyy-MM-dd
。
如果想要同時支持多種日期格式,可以使用format
字段
PUT my_index
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
剛才我們提到配置 Mapping 的日期格式的參數(shù)format
,Mapping 還提供了很多其他的參數(shù)。
我們來介紹幾個常用的字段。
首先是fields
,它可以使同一個字段通過不同的方式實現(xiàn)不同的目的。
例如,我們可以對一個字符串字段設(shè)置為text
類型,用于全文檢索,同時可以利用fields
設(shè)置為keyword
類型,用于排序和聚合。
PUT my-index-000001
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
查詢時我們就可以使用city
進(jìn)行全文檢索,使用city.raw
進(jìn)行排序和聚合。
GET my-index-000001/_search
{
"query": {
"match": {
"city": "york"
}
},
"sort": {
"city.raw": "asc"
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw"
}
}
}
}
有些時候,我們只想把某個字段作為數(shù)據(jù)存儲來使用,并不需要用來做搜索,這時,我們就可以將這個字段禁用掉,字段被禁用以后,它所保存的值也不受 mapping 指定的類型控制。
PUT my-index-000001
{
"mappings": {
"properties": {
"user_id": {
"type": "keyword"
},
"last_updated": {
"type": "date"
},
"session_data": {
"type": "object",
"enabled": false
}
}
}
}
上面的例子中,我們禁用掉了 session_data
這個字段,這時,你既可以往 session_data
字段中存儲 JSON 格式的數(shù)據(jù),也可以存儲非 JSON 格式的數(shù)據(jù)。
除了針對于單個字段的禁用以外,我們還可以直接禁用掉整個 mapping。我們來重新創(chuàng)建一個index
PUT my-index-000002
{
"mappings": {
"enabled": false
}
}
這時,文檔所有的字段都不會被索引,只是用來存儲。
需要注意的是,無論是具體字段中還是整個 mapping 的 enabled 屬性都不可以被修改,因為一旦設(shè)置為 false,Elasticsearch 就不會對字段進(jìn)行索引了,也不會校驗數(shù)據(jù)的合法性,如果產(chǎn)生了臟數(shù)據(jù)以后再設(shè)置為 true,就會造成程序錯誤。
null 在 Elasticsearch 中是不可以被索引或搜索的,這里我們所說的 null 并不是狹義上某種語言的 null,而是所有的空值。例如所有值都是 null 的數(shù)組,總之,這里的定義就是沒有值。
對于有需要搜索空值的業(yè)務(wù)怎么辦呢?Elasticsearch 為我們提供了 null_value
這個參數(shù),它可以指定一個值,搜索時使用這個值來替代空值。
舉個栗子
PUT my-index-000001
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
我們給 status_code
字段設(shè)置了 null_value
為 "NULL"
。這里需要注意, null_value
的類型必須與要查找的數(shù)據(jù)類型相同,如果在這個例子中 status_code
的類型是long,那么就不能把null_value
設(shè)置為 "NULL"
。
對于新增加的字段:
_source
中對于已有的字段,一旦已經(jīng)有數(shù)據(jù)寫入,就不再支持修改字段定義
我們在創(chuàng)建索引時,可以不用手動寫 Mappings, Elasticsearch 會幫我們自動識別出字段的類型。我們稱之為 Dynamic Mapping。不過有時推算的可能不是很準(zhǔn)確。
Elasticsearch 自動識別類型是基于 JSON 的。數(shù)據(jù)類型的對應(yīng)關(guān)系如下(表格來自 elastic 官網(wǎng))
「JSON data type」 | 「Elasticsearch data type」 |
---|---|
null | No field is added. |
true or false | boolean field |
floating point number | float field |
integer | long field |
object | object field |
array | Depends on the first non-null value in the array. |
string | Either a date field (if the value passes date detection), a double or long field (if the value passes numeric detection) or a text field, with a keyword sub-field. |
Elasticsearch 支持的字段映射的數(shù)據(jù)類型在這個文檔中,除了這些,其他的類型映射都需要顯示的指定了。
關(guān)于日期類型,默認(rèn)是可以映射的,但是 Elasticsearch 只能識別幾種格式的日期yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis
。如果關(guān)掉了 date_detection
開關(guān),那么就只能識別為字符串了。
PUT my-index-000001
{
"mappings": {
"date_detection": false
}
}
當(dāng)然,你也可以根據(jù)需要自己指定要識別的日期格式,只需要使用 dynamic_date_formats
參數(shù)即可。
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
Elasticsearch 還提供了一種把字符串型的數(shù)字識別為數(shù)字的能力,它是由 numeric_detection
開關(guān)控制的。
PUT my-index-000005
{
"mappings": {
"numeric_detection": true
}
}
PUT my-index-000005/_doc/1
{
"my_float": "1.0",
"my_integer": "1"
}
在這個例子中,my_float
會被識別為 float 類型,而 my_integer
會被識別為 long 類型。
dynamic template 允許我們自定義 mapping ,并應(yīng)用到具體索引上。dynamic template 的定義一般是這樣的
"dynamic_templates": [
{
"my_template_name": {
... match conditions ...
"mapping": { ... }
}
},
...
]
my_template_name
可以是任意字符串。
match conditions
包括match_mapping_type
, match
, match_pattern
, unmatch
, path_match
, path_unmatch
這幾種。
mapping
就是指匹配到的字段應(yīng)該使用怎樣的 mapping。下面我們介紹幾種 match conditions
我們先來看一個簡單的例子
PUT my-index-000001
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
這里我們有兩個模版,其一是使用 integer
類型來代替 long
類型,其二是將字符串類型映射為 keyword
。
這兩個比較簡單,match 是指匹配到模式的字段, unmatch 是表示不匹配的字段。
PUT my-index-000001
{
"mappings": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
在這個例子中,我們需要的是 long_
開頭的字符串,不需要 _text
結(jié)尾的字符串字段。
除了以上三種之外,其他的就是 match_pattern
用來進(jìn)行正則匹配,path_match
和 path_unmatch
則是表示字段所在路徑的是否匹配。
另外 dynamic template 還支持兩種變量替換,分別是 {name}
和 {dynamic_type}
。其實 name 就是字段名,dynamic_type 就是檢測出的字段類型。
到此,相信大家對“Mapping參數(shù)有哪些”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!