Mapping參數有哪些

本篇內容主要講解“Mapping參數有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Mapping參數有哪些”吧!

創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網技術服務公司,擁有項目網站建設、網站設計網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元通化做網站,已為上家服務,為通化各地企業(yè)和個人服務,聯(lián)系電話:13518219792

Mapping 在 Elasticsearch 中的地位相當于關系型數據庫中的 schema,它可以用來定義索引中字段的名字、定義字段的數據類型,還可以用來做一些字段的配置。從 Elasticsearch 7.0開始,Mapping 中不在乎需要定義 type 信息了,具體原因可以看官方的解釋。 

字段的數據類型

我們剛剛提到 Mapping 中可以定義字段的數據類型,這可能是 Mapping 最常用的功能了,所以我們先來看看 Elasticsearch 都支持哪些數據類型。

  • 簡單類型:text、keyword、date、long、double、boolean、ip
  • 復雜類型:對象類型、嵌套類型
  • 特殊類型:用于描述地理位置的 geo_point、geo_shape

Elasticsearch 支持的數據類型遠不止這些,由于篇幅原因,這里就不一一列舉了。我找?guī)讉€工作中常見的來介紹一下。

首先就是字符串了,Elasticsearch 中的字符串有 text 和 keyword 兩種。其中 text 類型的字符串是可以被全文檢索的,它會被分詞器作用,

PUT my_index
{
  "mappings": {
    "properties": {
      "full_name": {
        "type":  "text"
      }
    }
  }
}
 

在設置字段類型為 text 時,還可以利用一些參數對這個字段進行更進一步的定制。

index:標記這個字段是否能被搜索,默認是 true

search_analyzer:被搜索時所使用的分詞器,默認使用 setting 中設置的分詞器

fielddata:字段是否允許在內存中進行排序、聚合,默認是 false

meta:關于字段的一些元數據

像一些id、郵箱、域名這樣的字段,我們就需要使用 keyword 類型了。因為 keyword 類型可以支持排序、聚合,并且只能支持精確查詢。

有些同學可能會把 ID 設置為數字類型,這也是沒問題的,數字類型和 keyword 各有各的好處,使用數字類型可以進行范圍查找,而使用 keyword 類型則有更高的查詢效率。具體用哪種還要看使用場景。

日期類型在 Elasticsearch 中有三種表現(xiàn)形式

  1. 可以格式化成日期類型的字符串,如     "2020-07-26"和     "2015/01/01 12:10:30"這樣的
  2. 毫秒級時間戳用 long 類型表示
  3. 秒級時間戳用 integer 類型表示

在 Elasticsearch 內部,日期類型是以 long 類型的毫秒級時間戳存儲的,時區(qū)使用的是0時區(qū)。

我們可以自定義時間格式,默認使用的是strict_date_optional_time||epoch_millis

「strict_date_optional_time_nanos」是通用的日期格式解析,至少要包含年份,如果要包含時間,則用T分隔,例如yyyy-MM-dd'T'HH:mm:ss.SSSSSSZyyyy-MM-dd

如果想要同時支持多種日期格式,可以使用format字段

PUT my_index
{
  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}
   

Mapping參數

剛才我們提到配置 Mapping 的日期格式的參數format,Mapping 還提供了很多其他的參數。

  • analyzer
  • boost
  • coerce
  • copy_to
  • doc_values
  • dynamic
  • eager_global_ordinals
  • enabled
  • fielddata
  • fields
  • format
  • ignore_above
  • ignore_malformed
  • index_options
  • index_phrases
  • index_prefixes
  • index
  • meta
  • normalizer
  • norms
  • null_value
  • position_increment_gap
  • properties
  • search_analyzer
  • similarity
  • store
  • term_vector

我們來介紹幾個常用的字段。

 
fields

首先是fields,它可以使同一個字段通過不同的方式實現(xiàn)不同的目的。

例如,我們可以對一個字符串字段設置為text類型,用于全文檢索,同時可以利用fields設置為keyword類型,用于排序和聚合。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "raw": {
            "type":  "keyword"
          }
        }
      }
    }
  }
}
 

查詢時我們就可以使用city進行全文檢索,使用city.raw進行排序和聚合。

GET my-index-000001/_search
{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" 
      }
    }
  }
}
   
enabled

有些時候,我們只想把某個字段作為數據存儲來使用,并不需要用來做搜索,這時,我們就可以將這個字段禁用掉,字段被禁用以后,它所保存的值也不受 mapping 指定的類型控制。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "user_id": {
        "type":  "keyword"
      },
      "last_updated": {
        "type": "date"
      },
      "session_data": { 
        "type": "object",
        "enabled": false
      }
    }
  }
}
 

上面的例子中,我們禁用掉了 session_data 這個字段,這時,你既可以往 session_data 字段中存儲 JSON 格式的數據,也可以存儲非 JSON 格式的數據。

除了針對于單個字段的禁用以外,我們還可以直接禁用掉整個 mapping。我們來重新創(chuàng)建一個index

PUT my-index-000002
{
  "mappings": {
    "enabled": false 
  }
}
 

這時,文檔所有的字段都不會被索引,只是用來存儲。

需要注意的是,無論是具體字段中還是整個 mapping 的 enabled 屬性都不可以被修改,因為一旦設置為 false,Elasticsearch 就不會對字段進行索引了,也不會校驗數據的合法性,如果產生了臟數據以后再設置為 true,就會造成程序錯誤。

 
null_value

null 在 Elasticsearch 中是不可以被索引或搜索的,這里我們所說的 null 并不是狹義上某種語言的 null,而是所有的空值。例如所有值都是 null 的數組,總之,這里的定義就是沒有值。

對于有需要搜索空值的業(yè)務怎么辦呢?Elasticsearch 為我們提供了 null_value 這個參數,它可以指定一個值,搜索時使用這個值來替代空值。

舉個栗子

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type":       "keyword",
        "null_value": "NULL" 
      }
    }
  }
}
 

我們給 status_code 字段設置了 null_value"NULL"。這里需要注意, null_value 的類型必須與要查找的數據類型相同,如果在這個例子中 status_code 的類型是long,那么就不能把null_value 設置為 "NULL"

 
dynamic

對于新增加的字段:

  • dynamic 設置為 true 時,一旦有新增字段的文檔寫入,Mapping 也會被更新
  • dynamic 設置為 false 時,Mapping 不會被更新,新增字段無法被索引,但信息會出現(xiàn)在     _source
  • dynamic 設置為 strict 時,文檔寫入失敗

對于已有的字段,一旦已經有數據寫入,就不再支持修改字段定義

 

Dynamic Mapping

我們在創(chuàng)建索引時,可以不用手動寫 Mappings, Elasticsearch 會幫我們自動識別出字段的類型。我們稱之為 Dynamic Mapping。不過有時推算的可能不是很準確。

Elasticsearch 自動識別類型是基于 JSON 的。數據類型的對應關系如下(表格來自 elastic 官網)

「JSON data type」「Elasticsearch data type」
nullNo field is added.
true or falseboolean field
floating point numberfloat field
integerlong field
objectobject field
arrayDepends on the first non-null value in the array.
stringEither a date field (if the value passes date detection), a double or long field (if the value passes numeric detection) or a text field, with a keyword sub-field.

Elasticsearch 支持的字段映射的數據類型在這個文檔中,除了這些,其他的類型映射都需要顯示的指定了。

關于日期類型,默認是可以映射的,但是 Elasticsearch 只能識別幾種格式的日期yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis。如果關掉了 date_detection 開關,那么就只能識別為字符串了。

PUT my-index-000001
{
  "mappings": {
    "date_detection": false
  }
}
 

當然,你也可以根據需要自己指定要識別的日期格式,只需要使用 dynamic_date_formats 參數即可。

PUT my-index-000001
{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}
 

Elasticsearch 還提供了一種把字符串型的數字識別為數字的能力,它是由 numeric_detection 開關控制的。

PUT my-index-000005
{
  "mappings": {
    "numeric_detection": true
  }
}

PUT my-index-000005/_doc/1
{
  "my_float":   "1.0", 
  "my_integer": "1" 
}
 

在這個例子中,my_float 會被識別為 float 類型,而 my_integer 會被識別為 long 類型。

 

Dynamic template

dynamic template 允許我們自定義 mapping ,并應用到具體索引上。dynamic template 的定義一般是這樣的

  "dynamic_templates": [
    {
      "my_template_name": { 
        ...  match conditions ... 
        "mapping": { ... } 
      }
    },
    ...
  ]
 

my_template_name 可以是任意字符串。

match conditions 包括match_mapping_type, match, match_pattern, unmatch, path_match, path_unmatch 這幾種。

mapping 就是指匹配到的字段應該使用怎樣的 mapping。下面我們介紹幾種 match conditions

 
match_mapping_type

我們先來看一個簡單的例子

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "fields": {
              "raw": {
                "type":  "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}
 

這里我們有兩個模版,其一是使用 integer 類型來代替 long 類型,其二是將字符串類型映射為 keyword。

 
match 和 unmatch

這兩個比較簡單,match 是指匹配到模式的字段, unmatch 是表示不匹配的字段。

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "longs_as_strings": {
          "match_mapping_type": "string",
          "match":   "long_*",
          "unmatch": "*_text",
          "mapping": {
            "type": "long"
          }
        }
      }
    ]
  }
}
 

在這個例子中,我們需要的是 long_ 開頭的字符串,不需要 _text結尾的字符串字段。

除了以上三種之外,其他的就是 match_pattern 用來進行正則匹配,path_matchpath_unmatch 則是表示字段所在路徑的是否匹配。

另外 dynamic template 還支持兩種變量替換,分別是 {name}{dynamic_type}。其實 name 就是字段名,dynamic_type 就是檢測出的字段類型。 

到此,相信大家對“Mapping參數有哪些”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

網站名稱:Mapping參數有哪些
轉載源于:http://muchs.cn/article14/piccge.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT網站排名、營銷型網站建設微信公眾號、、動態(tài)網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

手機網站建設