elasticsearch版本控制及mapping對映屬性介紹
學習elasticsearch不僅只會操作,基本的執行原理我們還是需要進行了解,以下內容我講對elasticsearch中的基本知識原理進行梳理,希望對大家有所幫助!
一、ES版本控制
1.Elasticsearch採用了樂觀鎖來保證資料的一致性,也就是說,當用戶對document進行操作時,並不需要對該document做加鎖和解鎖的操作,只需要指定要操作的版本即可。當版本號一致時,elasticsearch會允許該操作順利執行,而當版本號存在衝突時,elasticsearch會提示衝突並丟擲異常(versionConfilctEngineException
2.Elasticsearch的版本號取值範圍為1到2^63-1.
1、內部版本控制:
(1)使用的是_version 版本號要與文件的版本號一致
3.外部版本控制:elasticsearch在處理外部版本號時會對內部版本號的處理有些不同。他不在是檢查_version是否與請求中指定的數值相同,而是檢查當前的_version是否比指定的數值小。如果請求成功,那麼外部的版本號就會被儲存到文件中的_version中。
4.為保持_version與外部版本控制的資料一致,使用version_type=external
二、ES的mapping
1、核心資料型別(以下的資料型別與java的資料型別類似)
(1)字元型
①Text:被用來索引長文字,在建立索引前會將這項文字進行分詞,轉化為詞的組合,建立索引。允許ES來檢索這些詞語。Text型別不能用來排序和聚合。
②Keyword:不需要進行分詞,可以被用來檢索過濾、排序和聚合。Keyword型別欄位只能用本身來進行檢索
(2)數字型別
①byte,short,integer,Long,double,float
(3)日期型別:date
(4)二進位制型別:binary
2、Maping 支援的屬性
"type" : "text", #是資料型別一般文字使用text(可分詞進行模糊查詢);keyword無法被分詞(
"analyzer" : "ik_max_word", #指定分詞器,一般使用最大分詞:ik_max_word
"normalizer" : "normalizer_name", #欄位標準化規則;如把所有字元轉為小寫;具體如下舉例
"boost" : 1.5, #欄位權重;用於查詢時評分,關鍵欄位的權重就會高一些,預設都是1;另外查詢時可臨時指定權重
"coerce" : true, #清理髒資料:1,字串會被強制轉換為整數 2,浮點數被強制轉換為整數;預設為true
"copy_to" : "field_name", #自定_all欄位;指定某幾個欄位拼接成自定義;具體如下舉例
"doc_values" : true, #加快排序、聚合操作,但需要額外儲存空間;預設true,對於確定不需要排序和聚合的欄位可false
"dynamic" : true, #新欄位動態新增 true:無限制 false:資料可寫入但該欄位不保留 'strict':無法寫入拋異常
"enabled" : true, #是否會被索引,但都會儲存;可以針對一整個_doc
"fielddata" : false, #針對text欄位加快排序和聚合(doc_values對text無效);此項官網建議不開啟,非常消耗記憶體
"eager_global_ordinals": true, #是否開啟全域性預載入,加快查詢;此引數只支援text和keyword,keyword預設可用,而text需要設定fielddata屬性
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" ,#格式化 此引數代表可接受的時間格式 3種都接受
"ignore_above" : 100, #指定欄位索引和儲存的長度最大值,超過最大值的會被忽略
"ignore_malformed" : false ,#插入文件時是否忽略型別 預設是false 型別不一致無法插入
"index_options" : "docs" ,
# 4個可選引數
# docs(索引文件號),
# freqs(文件號 + 詞頻),
# positions(文件號 + 詞頻 + 位置,通常用來距離查詢),
# offsets(文件號 + 詞頻 + 位置 + 偏移量,通常被使用在高亮欄位)
# 分詞欄位預設是position,其他的預設是docs
"index" : true, #該欄位是否會被索引和可查詢 預設true
"fields": {"raw": {"type": "keyword"}} ,#可以對一個欄位提供多種索引模式,使用text型別做全文檢索,也可使用keyword型別做聚合和排序
"norms" : true, #用於標準化文件,以便查詢時計算文件的相關性。建議不開啟
"null_value" : "NULL", #可以讓值為null的欄位顯式的可索引、可搜尋
"position_increment_gap" : 0 ,#片語查詢時可以跨詞查詢 既可變為分詞查詢 預設100
"properties" : {}, #巢狀屬性,例如該欄位是音樂,音樂還有歌詞,型別,歌手等屬性
"search_analyzer" : "ik_max_word" ,#查詢分詞器;一般情況和analyzer對應
"similarity" : "BM25",#用於指定文件評分模型,引數有三個:
# BM25 :ES和Lucene預設的評分模型
# classic :TF/IDF評分
# boolean:布林模型評分
"store" : true, #預設情況false,其實並不是真沒有儲存,_source欄位裡會儲存一份原始文件。
# 在某些情況下,store引數有意義,比如一個文件裡面有title、date和超大的content欄位,如果只想獲取title和date
"term_vector" : "no" #預設不儲存向量資訊,
# 支援引數yes(term儲存),
# with_positions(term + 位置),
# with_offsets(term + 偏移量),
# with_positions_offsets(term + 位置 + 偏移量)
# 對快速高亮fast vector highlighter能提升效能,但開啟又會加大索引體積,不適合大資料量用
3、複雜資料型別
(1)陣列型別:陣列型別不需要專門制定陣列元素的type。例如:
①字元型陣列:[“one”,”two”]
②整形陣列:[1,2]
③陣列型陣列:[1,[2,3]]等價於[1,2,3]
④物件陣列:[{“name”:”mary”,”age”:20},{“name”:”john”,”age”:10}]
(2)物件型別(Object datatype):_object_用於單個json物件
(3)巢狀型別(Nested datatype):_nested_ 用於json陣列;
4、地理位置型別
(4)地理座標型別(Geo-pint datatype):_geo_point_ 用於經緯度座標:
(5)地理形狀型別(Geo-shape datatype):_geo_shape_用於類似於多邊形的複雜形狀;
5、特定型別
(6)IPv4 型別(IPv4 datatype):ip 用於IPv4 地址
(7)Completion 型別(Completion datatype):completion 提供自動補全建議
(8)Token count 型別(Token count datatype):token_count 用於統計做子標記的欄位的index數目,該值會一直增加,不會因為過濾條件而減少
(9)mapper-murmur3 型別:通過外掛,可以通過_murmur3_來計算index的雜湊值
(10)附加型別(Attachment datatype):採用mapper-attachments外掛,可支援_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
下篇部落格本人將記錄使用elasticsearch查詢的知識。若大家對本篇部落格有所疑問或不同見解,歡迎大家進行評論。本人部落格首頁地址:https://home.cnblogs.com/u/chenyuanbo/
技術在於溝通交流!