標籤:
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)。
elasticsearch 映射規則