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 ]
