# Elasticsearch學習筆記(四)Mapping映射
## Mapping簡述
Elasticsearch是一個schema-less的系統,但并不代表no shema,而是會盡量根據JSON源數據的基礎類型猜測你想要的字段類型映射。
Elasticsearch中Mapping類似于靜態語言中的數據類型,但是同語言的數據類型相比,映射還有一些其他的含義。
Elasticsearch會根據JSON源數據的基礎類型猜測你想要的字段映射。將輸入的數據轉變成可搜索的索引項。Mapping就是我們自己定義的字段的數據類型,同時告訴Elasticsearch如何索引數據以及是否可以被搜索。
## 映射的增刪改查
Elasticsearch可以根據數據中的新字段來創建新的映射,當然,在正式數據寫入之前我們可以自己定義Mapping,
等數據寫入時,會按照定義的Mapping進行映射。如果后續數據有其他字段時,Elasticsearch會自動進行處理。
~~~
curl -XPUT 'http://localhost:9200/logstash-2016.01.01/_mapping' -d '
{
"mappings" : {
"syslog" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"message" : {
"type" : "string"
},
"pid" : {
"type" : "long"
}
}
}
}
}
'
~~~
在這里需要注意一下,我們已經存在的索引是不可以更改它的映射的,對于存在的索引,只有新字段出現時,Elasticsearch才會自動進行處理。如果確實需要修改映射,那么就使用reindex,采用重新導入數據的方式完成。
### ReIndex
Elasticsearch并不提供針對索引的rename,mapping、alter等操作。如果需要更改某個字段的mapping映射,只有一些其他工具。
用Logstash重建索引:
在最新版的logstash中,對logstash-input-elasticsearch插件做了一定的修改,使得通過Logstash完成重建索引稱為可能。
### Delete
雖然寫入數據時Elasticsearch會自動的添加映射進行處理,但是刪除數據并不會刪除數據的映射
`?#curl -XDELETE 'http://localhost:9200/logstash-2016.01.01/syslog' `?刪除了syslog下面的全部數據,但是syslog的映射還在
刪除映射的命令:
`?#curl -XDELETE 'http://localhost:9200/logstash-2016.01.01/_mapping'`
刪除索引的話映射也會刪除
`?#curl -XDELETE 'http://localhost:9200/logstash-2016.01.01'`
### 查看:
學習索引的話最直接的方式就是查看logstash寫入數據到Elasticsearch的時候會根據自帶的template生成一個很有學習意義的映射
## Elasticsearch數據類型
Elasticsearch自帶的數據類型數Lucene索引的依據,也是我們做手動映射調整到依據。
映射中主要就是針對字段設置類型以及類型相關參數。
JSON基礎類型如下:
字符串:string
數字:byte、short、integer、long、float、double、
時間:date
布爾值: true、false
數組: array
對象: object
Elasticsearch獨有的類型:
多重: multi
經緯度: geo_point
網絡地址: ip
堆疊對象: nested object
二進制: binary
附件: attachment
注意點:
Elasticsearch映射雖然有idnex和type兩層關系,但是實際索引時是以index為基礎的。如果同一個index下不同type的字段出現mapping不一致的情況,雖然數據依然可以成功寫入并生成并生成各自的mapping,但實際上fielddata中的索引結果卻依然是以index內第一個mapping類型來生成的。
## 自定義字段映射
Elasticsearch的Mapping提供了對Elasticsearch中索引字段名及其數據類型的定義,還可以對某些字段添加特殊屬性:該字段是否分詞,是否存儲,使用什么樣的分詞器等。
### 精確索引:
字段都有幾個基本的映射選項,類型(type)和索引方式(index)。以字符串類型為例,index有三個選項:
analyzed:默認選項,以標準的全文索引方式,分析字符串,完成索引。
not_analyzed:精確索引,不對字符串做分析,直接索引字段數據的精確內容。
no:不索引該字段。
對于日志文件來說,很多字段都是不需要再Elasticsearch里做分析這步的,所以,我們可以這樣設置:
~~~
"myfieldname" : {
"type" : "string",
"index" : "not_analyzed"
}
~~~
### 時間格式:
@timestamp這個時間格式在Nginx中叫$time_iso8601,在Rsyslog中叫date-rfc3339,在Elasticsearch中叫dateOptionalTime.但事實上,Elasticsearch完全可以接受其他時間格式作為時間字段的內容。對于Elasticsearch來說,時間字段內容實際上就是轉換成long類型作為內部存儲的。所以,接受段的時間格式可以任意設置:
~~~
@timestamp: {
"type" : "date",
"index" : "not_analyzed",
"doc_values" : true,
"format" : "dd/MM/YYYY:HH:mm:ss Z"
}
~~~
### 多種索引:
多重索引是Logstash用戶習慣的的一個映射,因為這是Logstash默認開啟的配置:
~~~
"title" : {
"type" : "string",
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
~~~
其作用時,在title字段數據寫入的時候,Elasticsearch會自動生成兩個字段,分別是title和title.raw。這樣,有可能同時需要分詞和部分次結果的環境,就可以很靈活的使用不同的索引字段了。比如,查看標題中最常用的單詞,應該是使用title字段,查看閱讀數最多的文章標題,應該是使用title.raw字段。
### 多值字段:
### 空字段:
數組可以使空的。這等于有零個值。事實上,Lucene沒法存放null值,所以一個null值的字段唄認為是孔子段。
下面這四個字段將被識別為空字段而不被索引:
~~~
"empty_string" : "",
"null_value" : null,
"empty_array" : [],
"array_with_null_value" : [ null ]
~~~
### 多層對象:?
我們需要討論的最后一個自然JSON數據類型是對象(object)。
內部對象(inner objects)經常用于嵌入一個實體或對象里的另一個地方。例如,