Elasticsearch 參考指南(映射)

映射

映射是定義文檔及其包含的字段如何存儲和索引的過程,例如,使用映射來定義:app

  • 哪些字符串字段應該被視爲全文字段。
  • 哪些字段包含數字、日期或地理位置。
  • 日期值的格式。
  • 用於控制動態添加字段的映射的自定義規則。

映射類型

每一個索引都有一個映射類型,它決定文檔將如何被索引。code

映射類型具備:orm

元字段對象

  • 元字段用於自定義如何處理文檔的關聯元數據,元字段的示例包括文檔的_index_type_id_source字段。

字段或屬性排序

  • 映射類型包含與文檔相關的字段或屬性列表。

字段數據類型

每一個字段都有一個數據type索引

  • 簡單的類型,如textkeyworddatelongdoublebooleanip
  • 支持JSON的層次結構的類型,如objectnested
  • 或者像geo_pointgeo_shapecompletion這樣的特殊類型。

爲不一樣的目的以不一樣的方式索引相同的字段一般是有用的,例如,字符串字段能夠做爲全文搜索的text字段索引,也能夠做爲排序或聚合的keyword字段索引,或者,你可使用標準分析器、英語分析器和法語分析器索引字符串字段。ip

這就是多字段的目的,大多數數據類型經過fields參數支持多字段。內存

防止映射爆炸的設置

在索引中定義太多字段會致使映射爆炸,這會致使內存不足和難以恢復的狀況,這個問題可能比預期的要廣泛。例如,考慮這樣一種狀況,其中插入的每一個新文檔都引入了新字段,這在動態映射中很是常見,每當文檔包含新字段時,這些字段就會出如今索引的映射中。這對於少許數據來講並不使人擔憂,可是隨着映射的增加,這可能會成爲一個問題,如下設置容許你限制能夠手動或動態建立的字段映射的數量,以防止錯誤的文檔致使映射爆炸:文檔

index.mapping.total_fields.limit字符串

  • 索引中字段的最大數目,字段和對象映射以及字段別名都屬於此限制,默認值是1000

index.mapping.depth.limit

  • 字段的最大深度,用內部對象的數量來度量,例如,若是全部字段都在根對象級別定義,則深度爲1,若是有一個對象映射,則深度爲2,依此類推,默認值是20

index.mapping.nested_fields.limit

  • 索引中不一樣嵌套映射的最大數目,默認爲50

index.mapping.nested_objects.limit

  • 跨全部嵌套類型的單個文檔中嵌套JSON對象的最大數量,默認爲10000

index.mapping.field_name_length.limit

  • 設置字段名稱的最大長度,默認值是Long.MAX_VALUE(沒有限制),這個設置實際上並無解決映射爆炸的問題,可是若是你想限制字段長度,那麼它仍然是有用的,一般不須要設置這個設置,默認值沒有問題,除非用戶開始添加大量具備很是長的名稱的字段。

動態映射

字段和映射類型在使用以前不須要定義,多虧了動態映射,新的字段名將自動添加,只需索引文檔,能夠向頂級映射類型、內部對象和嵌套字段添加新字段。

能夠配置動態映射規則來定製用於新字段的映射。

顯式的映射

你對數據的瞭解超過了Elasticsearch所能猜到的,所以,儘管開始動態映射可能頗有用,但在某個時候,你可能但願指定本身的顯式映射。

你能夠在建立索引時建立字段映射,還可使用PUT mapping API將字段添加到現有索引中。

更新現有字段映射

除非有文檔記錄,不然沒法更新現有字段映射,更改映射將意味着已經索引的文檔無效。相反,應該使用正確的映射建立一個新索引,並將數據從新索引到該索引中,若是隻但願重命名字段而不更改其映射,那麼引入別名字段多是有意義的。

映射示例

能夠在建立索引時指定映射,以下所示:

PUT my_index 
{
  "mappings": {
    "properties": { 
      "title":    { "type": "text"  }, 
      "name":     { "type": "text"  }, 
      "age":      { "type": "integer" },  
      "created":  {
        "type":   "date", 
        "format": "strict_date_optional_time||epoch_millis"
      }
    }
  }
}
  • 建立一個名爲my_index的索引。
  • 指定映射中的字段或屬性。
  • 指定title字段包含text值。
  • 指定name字段包含text值。
  • 指定age字段包含integer值。
  • 指定created字段包含兩種可能格式的date值。
相關文章
相關標籤/搜索