elasticsearch 之mapping

elasticsearch 之mapping

前言

在ES中,index至關於數據庫,type至關於表,而mapping則至關於表結構。數據庫

簡單來說,elasticsearch會在你插入數據的時候,自動根據數據類型設置mapping格式。並且由於通常文檔數據都是不規則的,因此ES的mapping會根據插入值格式的變動,自動進行mapping變動。json

雖然對於初學者而言,不須要了解mapping裏面的各類特性,也能夠很方便的使用ES的各類搜索功能,這也是ES推薦的——開箱即用。對初學者來講是十分友好的。數組

可是對於一個系統開發人員,必需要保證對系統很是熟悉,同時也要對數據的處理進行優化,這就須要進階學習(若是你還在初級入門階段,本文章中的內容你能夠直接忽略,以後有興趣再來閱讀)。瀏覽器

目錄

言歸正傳,咱們分如下幾個部分來學習ES的mapping是怎麼玩耍的。網絡

  1. mapping說明
  2. mapping的建立及修改方式;
  3. mapping中的可設置的屬性;
  4. mapping調優;

mapping說明

ES的mapping很是相似於靜態語言中的數據類型:聲明一個變量爲int類型的變量, 之後這個變量都只能存儲int類型的數據。一樣的, 一個number類型的mapping字段只能存儲number類型的數據。數據結構

同語言的數據類型相比,mapping還有一些其餘的含義,mapping不只告訴ES一個field中是什麼類型的值, 它還告訴ES如何索引數據以及數據是否能被搜索到。app

當你的查詢沒有返回相應的數據, 你的mapping頗有可能有問題。當你拿不許的時候, 直接檢查你的mapping。elasticsearch

如何查看當前數據庫裏面的mapping(你能夠用postman或者瀏覽器訪問如下連接):post

http://127.0.0.1:9200/{index}/{type}/_mapping?pretty性能

若是index爲: b2bware, type爲:commerical_sku

http://127.0.0.1:9200/b2bware/commercial_sku/_mapping?pretty

以上是看某個type下的mapping結構,若是你要看整個庫的mapping,URL請去掉type斷便可,如:

http://127.0.0.1:9200/b2bware/_mapping?pretty

返回結果如:

{
  "b2bware" : {
    "mappings" : {
      "commercial_sku" : {
        "properties" : {
          "message" : {
            "type" : "string"
          },
          "price" : {
            "type" : "string"
          },
          "tid" : {
            "type" : "string"
          },
          "user" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

mapping的建立及修改方式

mapping的建立

第一種建立方式

就是直接插入數據,而後ES根據插入數據格式自動識別建立mapping,這種傻瓜式的方式很是簡便,適合初學者。

如,建立一個ID爲1 的新對象: http://127.0.0.1:9200/b2bware/newtable/1

{
     "name":"test info ",
      "content":"簡單的json對象"
    }

第二種建立方式

建index的時候,直接指定mappings,能夠一次性建立多個mapping,以下面的代碼所示:

URL:

http://127.0.0.1:9200/b2bware

參數body(放在post或者put請求的body部分)

{
  "settings": {
    "index": {
      "number_of_shards": "10",  //分10個片
      "number_of_replicas": "1"  //1個備份
    }
  },
  "mappings": {
    "commercial_sku": { //這是其中一個mapping,你還能夠建立其餘mapping
      "_timestamp": {  //這個配置能夠刪掉
        "enabled": true
      },
        "properties": {
          "message": {
            "type": "string"
          },
          "price": {
            "type": "string"
          },
          "tid": {
            "type": "string"
          },
          "user": {
            "type": "string"
          }
        }
    }
  }
}

第三種建立方式

已經建立了index(庫已經建立),新增一個mapping

URL:http://127.0.0.1:9200/b2bware/_mapping/article PUT方式

注意,這種建立方式type[表名]是在URL中指定的,BODY部分只是指定了表結構:

{
    "properties": {
      "message": {
        "type": "string"
      },
      "price": {
        "type": "string"
      },
      "tid": {
        "type": "string"
      },
      "user": {
        "type": "string"
      }
    }
}

mapping的修改

由於mapping只能進行追加修改,因此在建type的時候,最好清晰的知道表結構,不然數據變動起來比較麻煩,就像MySQL中已經有一個age存儲的是字符串,忽然有一天想改成int,由於存在歷史數據,要變動就不那麼容易。

因此ES的mapping調整隻能追加字段,以下,新增一個 visitCount字段:

URL:http://127.0.0.1:9200/b2bware/article/_mapping PUT方式

{
    "properties": {
      "visitCount": {
        "type": "integer"
      }
    }
}

mapping的注意事項

mapping一旦建立以後,就沒法修改,只能追加,若是要修改,就須要刪除掉整個文檔進行重建。

2. mapping中的可設置的屬性

mappings : 在index(庫)下建立時使用,下面能夠有多個mapping 如下數據結構主要針對每一個mapping進行說明:

一級屬性 二級屬性 三級屬性 說明
dynamic     新增字段自動模式;true:表示自動識別新字段並建立索引,false:不自動索引新字段,strict:遇到未知字段,拋異常,不能存入
_timestamp     是否使用時間戳,ES會自動加時間戳,使用的話請百度
properties     屬性列表(相似數據庫多個字段定義)
  {字段名}   某個字段的定義
    type 數據類型,參見數據類型說明
    index 映射選型,參見映射選型說明
    doc_values 布爾值, 對not_analyzed字段,默認都是開啓,分詞字段不能使用,對排序和聚合能提高較大性能,節約內存
    format 若是數據類型爲日期格式,傳入值得時候是字符串,ES須要一個格式進行識別,如:yyyy-MM-dd HH:mm: ss
    analyzer 分詞器,如ik,ansj(中文分詞)
    boost 浮點型,字段級別的分數加權(權重)
    ignore_above 超過多少字符,就不處理,分詞性能損耗較大,對字符串較長的可不分詞
    null_value 設置一些缺失字段的初始化值,只有string可使用,分詞字段的null值也會被分詞
    store 是否單獨設置此字段的是否存儲而從_source字段中分離,默認是false,只能搜索,不能獲取值
    search_analyzer 設置搜索時的分詞器,默認跟ananlyzer是一致的,好比index時用standard+ngram,搜索時用standard用來完成自動提示功能
    其它 similarity,term_vector,norms,include_in_all,index_options,fielddata,ignore_malformed,precision_step

格式錯亂請看圖片

一個典型的mapping對象的屬性有:

{
    "mappings": {
        "my_type": {
        //true:表示自動識別新字段並建立索引,false:不自動索引新字段,strict:遇到未知字段,拋異常,不能存入
            "dynamic":      "strict", 
            
              //動態模板
             "dynamic_templates": [
                    { "stash_template": {
                      "path_match":  "stash.*",
                      "mapping": {
                        "type":           "string",
                        "index":       "not_analyzed"
                      }
                    }}
                  ],
            //屬性列表
            "properties": {
                //一個strign類型的字段
                "title":  { "type": "string"},
                
                "stash":  {
                    "type":     "object",
                    "dynamic":  true 
                }
            }
        }
    }
}

Elasticsearch數據類型

Elasticsearch自帶的數據類型是Lucene索引的依據,也是咱們作手動映射調整到依據。 映射中主要就是針對字段設置類型以及類型相關參數。

JSON基礎類型以下:

字符串:string
數字:byte、short、integer、long、float、double、
時間:date
布爾值: true、false
數組: array
對象: object

Elasticsearch獨有的類型:

多重: multi
經緯度: geo_point
網絡地址: ip
堆疊對象: nested object
二進制: binary
附件: attachment

(3)複合類型

數組類型:沒有明顯的字段類型設置,任何一個字段的值,均可以被添加0個到多個,要求,他們的類型必須一致: 對象類型:存儲相似json具備層級的數據 嵌套類型:支持數組類型的對象Aarray[Object],可層層嵌套

(4)地理類型

geo-point類型: 支持經緯度存儲和距離範圍檢索
geo-shape類型:支持任意圖形範圍的檢索,例如矩形和平面多邊形

(5)專用類型 ipv4類型:用來存儲IP地址,es內部會轉換成long存儲
completion類型:使用fst有限狀態機來提供suggest前綴查詢功能
token_count類型:提供token級別的計數功能
mapper-murmur3類型:安裝sudo bin/plugin install mapper-size插件,可支持_size統計_source數據的大小

注意點:

Elasticsearch映射雖然有idnex和type兩層關係,可是實際索引時是以index爲基礎的。 若是同一個index下不一樣type的字段出現mapping不一致的狀況 雖然數據依然能夠成功寫入並生成並生成各自的mapping, 但實際上fielddata中的索引結果卻依然是以index內第一個mapping類型來生成的。

映射選型說明

某個屬性(字段)的index可選值有:

analyzed:默認選項,以標準的全文索引方式,分析字符串,完成索引。
not_analyzed:精確索引,不對字符串作分析,直接索引字段數據的精確內容。
no:不索引該字段。

關於動態模板

參考如下連接: http://www.javashuo.com/article/p-tndjeblh-bm.html

相關文章
相關標籤/搜索