1. 程式人生 > >elasticsearch版本控制及mapping對映屬性介紹

elasticsearch版本控制及mapping對映屬性介紹

       學習elasticsearch不僅只會操作,基本的執行原理我們還是需要進行了解,以下內容我講對elasticsearch中的基本知識原理進行梳理,希望對大家有所幫助!

一、ES版本控制

1.Elasticsearch採用了樂觀鎖來保證資料的一致性,也就是說,當用戶對document進行操作時,並不需要對該document做加鎖和解鎖的操作,只需要指定要操作的版本即可。當版本號一致時,elasticsearch會允許該操作順利執行,而當版本號存在衝突時,elasticsearch會提示衝突並丟擲異常(versionConfilctEngineException

異常)。

2.Elasticsearch的版本號取值範圍為12^63-1.

1、內部版本控制:

(1)使用的是_version 版本號要與文件的版本號一致

 

3.外部版本控制:elasticsearch在處理外部版本號時會對內部版本號的處理有些不同。他不在是檢查_version是否與請求中指定的數值相同,而是檢查當前的_version是否比指定的數值小。如果請求成功,那麼外部的版本號就會被儲存到文件中的_version中。

4.為保持_version與外部版本控制的資料一致,使用version_type=external

 

二、ESmapping

1、核心資料型別(以下的資料型別與java的資料型別類似)

(1)字元型

①Text:被用來索引長文字,在建立索引前會將這項文字進行分詞,轉化為詞的組合,建立索引。允許ES來檢索這些詞語。Text型別不能用來排序聚合

②Keyword:不需要進行分詞,可以被用來檢索過濾、排序和聚合。Keyword型別欄位只能用本身來進行檢索

(2)數字型別

①byte,short,integer,Long,double,float

(3)日期型別:date

(4)二進位制型別:binary

2Maping 支援的屬性

"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_valuestext無效);此項官網建議不開啟,非常消耗記憶體

    "eager_global_ordinals": true, #是否開啟全域性預載入,加快查詢;此引數只支援textkeywordkeyword預設可用,而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 ESLucene預設的評分模型

    # classic TF/IDF評分

    # boolean:布林模型評分

    "store" : true, #預設情況false,其實並不是真沒有儲存,_source欄位裡會儲存一份原始文件。

    # 在某些情況下,store引數有意義,比如一個文件裡面有titledate和超大的content欄位,如果只想獲取titledate

    "term_vector" : "no" #預設不儲存向量資訊,

    # 支援引數yesterm儲存),

    # with_positionsterm + 位置),

    # with_offsetsterm + 偏移量),

    # 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 格式, ePubHTML

      下篇部落格本人將記錄使用elasticsearch查詢的知識。若大家對本篇部落格有所疑問或不同見解,歡迎大家進行評論。本人部落格首頁地址:https://home.cnblogs.com/u/chenyuanbo/

技術在於溝通交流!