1、Mapping的概念html
一、Mapping相似於數據庫中的Schema的定義,做用以下:正則表達式
1)定義索引中的字段的名稱;數據庫
2)定義字段的數據類型,例如字符串、數字、日期、布爾等;數組
3)對每一個字段進行倒排索引的創建及相關配置;app
4)Mapping會將Json文檔映射成Lucene所須要的扁平格式;學習
5)一個Mapping屬於一個索引的Type,從7.0開始,不須要在Mapping中指定Type信息;url
二、字段的數據類型spa
1)簡單類型插件
Text(會增長Keyword子字段);3d
Date;
Integer/Long/Floating;
Boolean;
IP4&IP6;
Keyword;
2)複雜類型
對象類型;
嵌套類型;
數組(由第一個非空數值的類型所決定);
空值;
3)特殊類型(地理信息)
geo_point&geo_shape
2、Dynamic Mapping的概念
一、在寫入文檔的時候,若是索引不存在,則會自動建立索引;
二、因爲上述機制,能夠無需手動定義Mapping,ElasticSearch會自動根據文檔信息,推算出字段的類型;
三、可是有時候推算的可能不對,當類型設置的不對時,會致使一些功能沒法正常運行,好比範圍內的Range查詢;
3、Mapping與Dynamic Mapping的使用
一、推斷字段的類型
//建立一個文檔 put mapping_test/_doc/1 { "id":"100", "isvip":false, "isadmin":"true", "age":18, "height":180 } //查看索引Mapping結構 get mapping_test/_mapping //刪除索引 delete mapping_test
由上圖中能夠得出,ElasticSearch基本上能夠按照數據推斷出預想的字段類型,因爲isadmin字段的值是由雙引號所括起來的,因此該字段被推斷成text類型。
二、更改Mapping的字段類型
對於索引後期加入的字段,能夠按照以下狀況進行設置:
1)新增長字段
a)Dynamic設置爲True時,一旦有新增字段的文檔寫入,Mapping同時會被更新;
b)Dynamic設置爲False時,有新增字段的文檔寫入,Mapping不會被更新,新增字段的數據也沒法被索引,可是信息會出如今_Source中;
c)Dynamic設置成Strict時,文檔寫入失敗;
2)已有字段
a)對於已有字段,一旦已經有數據寫入,就再也不支持修改字段定義。由於Lucene實現的倒排索引,一旦生成後,就不容許修改。
b)若是但願改變已有字段類型,必須ReIndex,重建索引;
爲何會這樣?
I)若是修改了字段的數據類型,會致使已被索引的屬於沒法被搜索;
II)正由於如此,對於新增長的字段,就不會有這個問題的影響;
三、對於這幾種狀況,咱們經過下圖進行演示:
1)對於dynamic爲true時,對於建立的文檔中的某一字段進行搜索,是能夠查詢到的。
2)將dynamic設置爲false,而後新增一個name字段,而後對其搜索,是沒法搜索到的。
同時mapping中也不存在該字段。
可是能夠在_Source中看到這個字段。
3)將dynamic設置爲strict,而後新增一個grade字段,會發現出現異常。
4、索引Mapping的顯式定義
一、Mapping定義的方式有兩種:
1)能夠參考API手冊,純手寫;
2)爲了減小輸入工做量,減小出錯機率,能夠依照如下步驟:
a)建立一個臨時的Index,寫入一些樣本數據;
b)經過訪問Mapping API獲取該臨時索引的動態Mapping定義;
c)修改爲符合要求的Json,而後建立顯式索引;
d)將臨時索引刪除;
二、顯式Mapping定義的語法:
Put Index_Name { "mappings":{ 定義Mapping信息,Json格式
"properties":{
"column_name":{
"type":"text"
},
"column_name":{
"type":"long"
}
...
}
}
}
三、顯式Mapping定義的說明:
1)控制當前字段是否能夠被索引,默認是True。若是設置成False,則該字段不可被搜索。
將不被搜索的字段設置成索引爲false,能夠節省磁盤開銷,由於這樣該字段就不須要進行倒排索引了。
2)對於須要索引的字段,ElasticSearch提供了Index_options配置,能夠控制倒排索引記錄的內容,Index_options提供了四種控制級別:
a)docs:記錄doc的Id;
b)freqs:記錄doc Id、Term Frequencies;
c)positions:記錄doc Id、Term Frequencies、Term Position;
d)offsets:記錄doc Id、Term Frequencies、Term Position、Character offsets;
3)Text類型默認是positions級別,其餘類型默認是docs級別;
4)索引字段須要記錄的內容越多,那麼佔用存儲空間越大;
5)只有keyword類型支持設定Null值;
6)copy_to的設置,是將字段的值拷貝到所設定的目標字段中,當查詢時,能夠將該目標字段作爲搜索字段進行查詢。可是該目標字段不會出如今_source中。
7)數組類型在ElasticSearch中並不提供,可是對於任何字段,是能夠包含多個相同類型的數據的。
8)對字段還能夠指定特定的analyzer。
9)查看索引Mapping,以下所示:
5、ElasticSearch字段特性與自定義Analyzer
一、Exact Values(精確值)、Full Text(全文本)
Exact Values就是指具體數字、日期、字符串,此類值是不須要進行分詞的;
Full Text:是非結構化的文本數據,是須要進行分詞的;
二、自定義分詞器
當ElasticSearch自帶的分詞器沒法知足要求時,能夠自定義分詞器,經過組合不一樣的Character Filter、Tokenizer、Token Filter進行實現。
1)Charater Filters
a)在Tokenizer以前,經過使用Character Filters對文本進行處理,如刪除或者替換字符。此種處理會影響後續Tokenizer對Term的Position與Offset的信息。
b)能夠設置多個Character Filters,一個自帶的Character Filters包括:HTML Strip(去除HTML標籤)、Mapping(字符串替換)、Pattern Replace(正則表達式替換)。
以下圖所示:
2)Tokenizer
a)將原始的文本按照必定的規則,進行切分紅詞(Term or Token);
b)內置的Tokenizer有:Standard、uax_url_email、WhiteSpace、keyword、Pattern、Path hierarchy;
c)能夠實現本身的Tokenizer插件;
以下圖所示:
3)Token Filters
a)將Tokenizer輸出的Term,進行增長、修改、刪除;
b)內置的Token Filters有:lowercase、stop、synonym(近義詞);
以下圖所示:
三、自定義Analyzer使用
在圖中的emotion、customer、english_stop,是分別對Character Filter、Tokenizer、Token Filter的自定義配置。
注意:字段類型keyword與text類型的子字段keyword的說明:
一、一切文本類型的字符串能夠定義成"text"或"keyword"兩種類型。區別在於,text類型會使用默認分詞器分詞(固然也能夠指定特定的分詞器),keyword類型默認不會對其進行分詞;
二、多字段類型狀況下,查詢時能夠用title,也能夠用title.keyword查詢類型爲keyword的子字段;
你們可關注個人公衆號
知識學習來源:阮一鳴:《Elasticsearch核心技術與實戰》
原文出處:https://www.cnblogs.com/supersnowyao/p/11189661.html