Elasticsearch Mapping設定
Mapping類似資料庫中的表結構定義,主要作用如下:
- 定義Index下的欄位名(Field Name)
- 定義欄位的型別,比如資料型、字串型、布林型等
- 定義倒排索引相關配置,比如是否索引、記錄position等
自定義mapping:
Mapping中欄位型別一旦設定後,禁止直接修改(Lucene實現的倒排索引生成後不允許修改)
重新建立新的索引,然後做reindex操作
允許新增欄位
通過dynamic
引數來控制欄位的新增
true:
預設值,允許自動新增欄位false:
不允許自動新增欄位,但是文件可以正常寫入,但無法對欄位進行查詢等操作strict:
文件不能寫入,報錯
通過例項來演示dynamic引數的用法:
#定義索引,定義title、name、age三個欄位型別,對於其他新增欄位dynamic設定為false
PUT myindex
{
"mappings": {
"doc": {
"dynamic": false,
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "keyword"
},
"age": {
"type" : "integer"
}
}
}
}
}
#檢視剛才自定義的mapping
GET myindex/_mapping
#索引一條文件,欄位title、desc,其中desc為新增欄位
PUT myindex/doc/1
{
"title": "hello world",
"desc": "nothing"
}
#使用title欄位查詢,一切正常
GET myindex/_search
{
"query": {
"match": {
"title": "hello"
}
}
}
#無法使用desc欄位進行查詢,返回為0
GET myindex/_search
{
"query": {
"match": {
"desc": "nothing"
}
}
}
引數說明
(一)index
:控制當前欄位是否索引,預設為true,即記錄索引,false不記錄,即不可搜尋
PUT myindex
{
"mappings": {
"doc": {
"properties": {
"cookie": {
"type": "text",
"index":false
}
}
}
}
}
#使用cookie欄位查詢會報錯
(二)index_options
:用於控制倒排索引記錄的內容,有如下4種配置
docs:
只記錄doc idfreqs:
記錄doc id 和term frequenciespositions:
記錄doc id、term frequencies和term positionoffsets:
記錄doc id、term frequencies、term position和character offsets
text
型別預設配置為positions
,其他預設為docs
記錄內容越多,佔用空間越大。
PUT myindex1
{
"mappings": {
"doc": {
"properties": {
"cookie": {
"type": "text",
"index_options": "offsets"
}
}
}
}
}
(三)null_value
: 當欄位遇到null值時的處理策略,預設為null,即空值,此時es會忽略該值。可以通過設定該值設定欄位的預設值
PUT myindex1
{
"mappings": {
"doc": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
}
資料型別
核心資料型別:
- 字串型:
text、keyword
- 數值型:
long、integer、short、byte、double、float、half_float、scaled_float
- 日誌型別:
date
- 布林型別:
boolean
- 二進位制型別:
binary
- 範圍型別:
integer_range、float_range、long_range、double_range、date_range
複雜資料型別:
- 屬組型別:
array
- 物件型別:
object
- 巢狀型別:
nested object
地理位置資料型別:
geo_point
geo_shape
專用型別:
- 記錄IP地址
ip
- 實現自動補全
completion
- 記錄分詞數
token_count
- 記錄字串hash值
murmur3
percolator
join
multi-fields
多欄位特性
允許對同一個欄位採用不同的配置,比如分詞,常見的例子如對人名實現拼音搜尋,只需要在人名中新增一個子欄位為pinyin即可。
PUT myindex1
{
"mappings": {
"doc": {
"properties": {
"username": {
"type":"text",
"fields": {
"pinyin": {
"type": "text",
"analyzer": "pinyin"
}
}
}
}
}
}
}
GET myindex1/_search
{
"query": {
"match": {
"username.pinyin": "hanhan"
}
}
}
Dynamic Mapping
動態欄位對映
es可以自動識別文件欄位型別,從而降低使用者使用成本,如下所示:
es自動識別age為long
型別,username為text
型別
es是依靠JSOn文件的欄位型別來實現自動識別字段型別,支援的型別如下:
驗證es自動識別:
PUT my_index2/doc/1
{
"username": "user1",
"age":14,
"birth":"1988-10-10",
"married": false,
"year": "18",
"tags": ["boy","fashion"],
"money":100.1
}
Dynamic日期與數字識別
日期識別:
預設是[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
"strict_date_optional_time"
是ISO datetime的格式,完整格式類似為:YYYY-MM-DDThh:mm:ssTZD(eg 1997-07-16T19:20:30+01:00)
dynamic_date_formats
可以自定義日期型別
date_detection
可以關閉日期自動識別的機制
PUT my_index
{
"mappings": {
"my_type":{
"dynamic_date_formats": ["yyyy-MM-dd"]
}
}
}
PUT my_index/my_type/1
{
"create_date": "2015-09-02"
}
GET my_index/_mapping
數字識別:
字串是數字時,預設不會自動識別為整型,因為字串中出現數字數完全合理的
numeric_detection
可以開啟字元創中數字的自動識別功能。如下所示:
PUT my_index
{
"mappings": {
"my_type":{
"numeric_detection":"true"
}
}
}
PUT my_index/my_type/1
{
"my_float": "1.0",
"my_integer": "1"
}
GET my_index/_mapping
動態模板
允許根據es自動識別的資料型別、欄位名等動態設定欄位型別,可以實現如下效果:
- 所有字串都設定為
keyword
型別,即預設不分詞 - 所有以
message
開頭欄位都設定為text
型別,即分詞 - 所有以
long_
開頭的欄位都設定為lon
g型別 - 所有自動匹配為
double
型別的都設定為float
型別,以節省空間
匹配規則一般有如下幾個引數:
match_mapping_type:
匹配es自動識別的欄位型別,如boolean,long,string等match,unmatch:
匹配欄位名path_match,path_unmatch
: 匹配路徑
Dynamic Template API
(一)設定字串預設使用keyword
型別
es預設會為字串設定為
text
型別,並增加一個keyword
的子欄位
PUT test_index
{
"mappings": {
"doc": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping":{
"type": "keyword"
}
}
}
]
}
}
}
PUT test_index/doc/1
{
"name": "alfred"
}
GET test_index/_mapping
(二)設定以message
開頭的欄位都設定為text
型別 (順序由上而下)
PUT test_index
{
"mappings": {
"doc": {
"dynamic_templates": [
{
"message_as_text": {
"match_mapping_type": "string",
"match": "message*",
"mapping":{
"type": "text"
}
}
},
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping":{
"type": "keyword"
}
}
}
]
}
}
}
自定義mapping建議
自定義mapping的操作步驟如下:
- 寫入一條文件到es的臨時索引中,獲取es自動生成的mapping
- 修改步驟1得到的mapping,自定義相關配置
- 使用步驟2的mapping建立實際所需索引
(一)索引一條文件到es的臨時索引中,並檢視預設mapping:
PUT test_index/doc/1
{
"referer": "-",
"response_code": "200",
"remote_ip": "192.168.20.200",
"method": "POST",
"user_name": "-",
"http_version": "1.1",
"body_sent": {
"bytes": "0"
},
"url": "/analyzevideo"
}
預設會為字串設定為text型別,並增加一個keyword
的子欄位
(二)根據預設的mapping進行自定義修改:
設定bytes
欄位型別為long
,url
欄位型別為text
,其餘欄位型別為keyword
PUT test_index
{
"mappings": {
"doc": {
"properties": {
"body_sent": {
"properties": {
"bytes": {
"type": "long"
}
}
},
"http_version": {
"type": "keyword"
},
"method": {
"type": "keyword"
},
"referer": {
"type": "keyword"
},
"remote_ip": {
"type": "keyword"
},
"response_code": {
"type": "keyword"
},
"url": {
"type": "text"
},
"user_name": {
"type": "keyword"
}
}
}
}
}
(3)使用動態模板對上邊自定義的mapping做進一步優化
PUT test_index
{
"mappings": {
"doc": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping":{
"type": "keyword"
}
}
}
],
"properties": {
"body_sent": {
"properties": {
"bytes": {
"type": "long"
}
}
},
"url": {
"type": "text"
}
}
}
}
}
索引模板
索引模板:英文為 Index Template
,主要用於在新建索引時自動應用預先設定的配置,簡化索引建立的操作步驟。
- 可以設定索引的配置和mapping
- 可以有多個模板,根據order設定,order大的覆蓋小的配置
索引模板API:
索引模板API,endpoint
為_template
,如下所示: