索引中每個文件都有乙個型別(type)。每個型別擁有自己的對映(mapping)或者模式定義(schema definition)。乙個對映定義了字段型別,每個欄位的資料型別,以及欄位被elasticsearch處理的方式。對映還用於設定關聯到型別上的元資料。
核心簡單字段型別
elasticsearch支援以下簡單字段型別:
當你索引乙個包含新字段的文件--乙個之前沒有的字段--elasticsearch將使用動態對映猜測字段型別,這型別來自於json的基本資料型別,使用以下規則:
這意味著,如果你索引乙個帶引號的數字--「123」,它將被對映為「string」型別,而不是「long」型別。然而,如果字段已經被對映為「long」型別,elasticsearch將嘗試轉換字串為long,並在轉換失敗時丟擲異常。
我們可以使用_mapping字尾來檢視elasticsearch中的對映。
curl -xget ""
小提示錯誤的對映,例如age欄位對映為string型別而不是integer型別,會造成查詢結果混亂。
要檢查對映型別,而不是假設它是正確的!
index引數控制字串以何種方式被索引。它包含以下三個值當中的乙個:
string型別字段預設是analyzed。如果我們想對映欄位為確切值,我們需要設定它為not_analyzed:
"tag" :
對於陣列不需要特殊的對映。任何乙個字段可以包含零個、乙個或多個值,同樣對於全文本段將被分析並產生多個詞。
這就意味著陣列中所有的值必須為同一型別。你不能把日期和字串混合。如果你建立乙個新字段,這個字段索引了乙個陣列,elasticsearch將使用第乙個值的型別來確定這個新字段的型別。
當你從elasticsearch中取回乙個文件,任何乙個陣列的順序和你索引它們的順序一致。你取回的_source欄位的順序同樣與索引它們的順序相同。
然而,陣列是做為多值字段被索引的,它們沒有順序。在搜尋階段你不能指定「第乙個值」或者「最後乙個值」。倒不如把陣列當作乙個值集合(gag of values)
當然陣列可以是空的。這等價於有零個值。事實上,lucene沒法存放null,所以乙個null值的字段被認為是空欄位。
這四個欄位將被識別為空字段而不被索引:
"empty_srting" : "",
"null_value" : null,
"empty_array" : ,
"array_with_null_value" : [null]
最後乙個自然json資料型別是物件(object)----在其它語言中叫做hashed、hashmaps、dictionaries或者associative arrays
內部物件(inner object)經常用於嵌入乙個實體或物件裡的另乙個地方。例如,做在tweet文件中user_name和user_id的替代,我們可以這樣寫:
"tweet" : "elastcsearch is very good",
"user" : {
"id" : "@johnsmith",
"gender" : "male",
"age" : 26,
"name" : {
"full" : "john smith",
"first" : "john",
"last" : "smith"
elasticsearch 動態對映
來確定欄位的資料型別並自動把新的字段新增到型別對映。有時這是想要的行為有時又不希望這樣。通常沒有人知道以後會有什麼新字段加到文件,但是又希望這些欄位被自動的索引。也許你只想忽略它們。如果elasticsearch是作為重要的資料儲存,可能就會期望遇到新字段就會丟擲異常,這樣能及時發現問題。幸運的是可...
ElasticSearch 型別對映
當檢視索引裡的資料,我們意識到一些奇怪的東西。有些事情看起來有問題,我們在索引裡有12個tweets,只有1個包含date 2014 09 15 現在讓我們看看這些查詢。get search?q 2014 12 results get search?q 2014 09 15 12 results g...
ElasticSearch 對映配置
索引有了,接下來肯定是新增資料。但是,在新增資料之前必須定義對映。什麼是對映?對映是定義文件的過程,文件包含哪些字段,這些字段是否儲存,是否索引,是否分詞等 只有配置清楚,elasticsearch才會幫我們進行索引庫的建立 不一定 語法 請求方式依然是put 示例 發起請求 images pric...