學習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/
技術在於溝通交流!
