Elasticsearch數據類型
Elasticsearch自帶的數據類型是Lucene索引的依據,也是我們做手動映射調整的依據。
映射中主要就是針對字段設置類型以及類型相關參數。
1.JSON基礎類型如下:
字符串:string
數字:byte、short、integer、long、float、double、
時間:date
布爾值: true、false
數組: array
對象: object
2.Elasticsearch獨有的類型:
多重: multi
經緯度: geo_point
網絡地址: ip
堆疊/嵌套對象: nested object
二進制: binary
附件: attachment
注意點:
1.映射應當在建立索引時,同時建立。如果索引建立后,還想做在索引中增加其他類型的映射,是不可以的。elasticsearch 對沒有做映射的類型,都已經指定默認映射。
2.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 ]