<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • Elasticsearch核心技術(三):Mapping設置

    Mapping是Elasticsearch中數據建模的基礎,本文從Mapping簡介、Dynamic Mapping、自定義Mapping和Mapping常用參數說明4個部分介紹Elasticsearch如何設置Mapping。

    3.1 Mapping簡介

    3.1.1 什么是Mapping

    Mapping類似數據庫中的表定義,主要作用如下:

    1. 定義索引下的字段名
    2. 定義字段的類型,比如數值型、字符串型、布爾型等
    3. 定義倒排索引相關的配置,比如是否索引、記錄position等

    使用API獲取Mapping:
    request:GET /test_index/_mapping
    response:

    {
      "test_index" : {
        "mappings" : {
          "properties" : {
            "age" : {
              "type" : "long"
            },
    
            "username" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
    

    3.1.2 Mapping支持的數據類型

    • 核心數據類型
      • 字符串型:text、keyword
      • 數值型:long、integer、short、byte、double、float、half_float、scaled_float
      • 日期類型:date
      • 布爾類型:boolean
      • 二進制類型:binary
      • 范圍類型:integer_range、float_range、long_range、double_range、data_range
    • 復雜類型
      • 數組類型:array
      • 對象類型:object
      • 嵌套類型:nested object
    • 特殊類型
      • 地理位置:geo_point、geo_shape、
      • IP地址:IPv4、IPv6
      • 自動補全:complete
      • percolator
    • 多字段特性:multi-fields
      • 允許對同一字段采用不同的配置,比如分詞,常見例子如對人名實現拼音搜索
      • 實現方式:在人名中新增一個子字段為pinyin即可

    3.2 Dynamic Mapping

    3.2.1 什么是Dynamic Mapping

    • 在文檔寫入的時候,如果索引不存在,會自動創建索引
    • Dynamic Mapping的機制,使得無需手動定義Mapping,Elasticsearch會自動識別字段的類型,從而降低用戶的使用成本
    • 但是有時候會推算的不對,例如地址位置信息
    • 當類型如果設置不對時,會導致一些功能無法正常使用,例如Range查詢

    3.2.2 類型的自動識別

    ES依靠JSON文檔的字段類型來實現自動識別字段類型,支持的類型如下:

    JSON類型 ES類型
    null 忽略
    boolean boolean
    浮點類型 float
    整數 long
    object object
    array 由第一個非null值的類型決定
    string 匹配日期格式,設置為Date(默認開啟);匹配數字,設置為float或者long(默認關閉);設置為Text,并且增加keyword子字段

    3.2.3 Dynamic的設置

    當創建Index的時候,dynamic字段可以設置成3種值:true、false、strict。

    例如:

    PUT movies
    {
        "mapping":{
            "_doc":{
                "dynamic":"false"
            }
        }
    }
    
    true false strict
    文檔可索引 ? ? ?
    字段可索引 ? ? ?
    Mapping被更新 ? ? ?

    說明:

    • 當設置成true的時候,文檔可以被索引,字段可以被搜索,Mapping文件可以更新。
    • 當dynamic被設置成false的時候,新增字段的數據可以寫入ES;該數據可以被索引,但是新增字段不可被搜索。
    • 當設置成strict的時候,數據寫入直接報錯。

    3.3 自定義Mapping

    3.3.1如何自定義Mapping

    自定義Mapping的一些建議

    • 可以參考API手冊,純手寫
    • 為了減少工作量,減少出錯率,可以參考以下步驟:
      1. 創建一個臨時的index,寫入一些樣本數據
      2. 通過訪問Mapping API獲得該臨時文本的動態Mapping定義
      3. 修改后,使用該配置創建索引
      4. 刪除臨時索引

    3.3.2 能否更改Mapping的字段類型

    ES能否更改Mapping的字段類型,需要分兩種情況進行分析。

    1. 新增字段
    dynamic設置為true(默認值)時,一旦有新增字段的文檔寫入,Mapping也同時被更新。
    dynamic設置為false時,Mapping不會被更新,更新字段的數據無法被索引,但是信息會出現在_source中,換言之,文檔可以正常寫入,但是無法對字段進行搜索。
    dynamic設置為strict時,文檔寫入失敗。

    2. 對已有字段,一旦已經有數據寫入,就不再支持修改字段定義。因為ES是基于Lucene實現的倒排索引,一旦生成后,就不允許修改。因為如果修改了字段的數據類型,會導致已被索引的數據無法被搜索。如果希望修改字段類型,必須使用Reindex API進行重建索引。

    3.4 Mapping常用參數說明

    • copy_to
      將該字段復制到目標字段,實現類似_all的作用;不會出現在_source中,只用來搜索

    • index
      控制當前字段是否索引,默認為true,即記錄索引,false不記錄,即不可搜索。

      例如某些場景希望敏感信息不用來做搜索,可以將index設置為false,則不可以用來搜索,也可以節省空間。

      index_option用于控制倒排索引記錄的內容,有4種配置:

      1. docs只記錄doc id
      2. freqs記錄doc id和term frequencies
      3. positions記錄doc id、term frequencies和term position
      4. offsets記錄doc id、term frequencies、term position和character offsets
        text類型默認配置為positions。其他默認是docs。當然記錄內容越多,占用空間越大。
    • null_value
      當字段遇到null值時的處理策略,默認為null,即空值,此時es會忽略該值;可以通過設定該屬性設定字段的默認值。

    更多常用參數可以參考:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html

    posted @ 2021-10-29 09:03  James_Shangguan  閱讀(490)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看