真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Mapping參數(shù)有哪些

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

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

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

字段的數(shù)據(jù)類型

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

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

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

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

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

在設(shè)置字段類型為 text 時,還可以利用一些參數(shù)對這個字段進(jìn)行更進(jìn)一步的定制。

index:標(biāo)記這個字段是否能被搜索,默認(rèn)是 true

search_analyzer:被搜索時所使用的分詞器,默認(rèn)使用 setting 中設(shè)置的分詞器

fielddata:字段是否允許在內(nèi)存中進(jìn)行排序、聚合,默認(rèn)是 false

meta:關(guān)于字段的一些元數(shù)據(jù)

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

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

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

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

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

我們可以自定義時間格式,默認(rèn)使用的是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參數(shù)

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

  • 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)不同的目的。

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

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

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

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

有些時候,我們只想把某個字段作為數(shù)據(jù)存儲來使用,并不需要用來做搜索,這時,我們就可以將這個字段禁用掉,字段被禁用以后,它所保存的值也不受 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 格式的數(shù)據(jù),也可以存儲非 JSON 格式的數(shù)據(jù)。

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

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

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

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

 
null_value

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

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

舉個栗子

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

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

 
dynamic

對于新增加的字段:

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

對于已有的字段,一旦已經(jīng)有數(shù)據(jù)寫入,就不再支持修改字段定義

 

Dynamic Mapping

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

Elasticsearch 自動識別類型是基于 JSON 的。數(shù)據(jù)類型的對應(yīng)關(guān)系如下(表格來自 elastic 官網(wǎng))

「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 支持的字段映射的數(shù)據(jù)類型在這個文檔中,除了這些,其他的類型映射都需要顯示的指定了。

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

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

當(dāng)然,你也可以根據(jù)需要自己指定要識別的日期格式,只需要使用 dynamic_date_formats 參數(shù)即可。

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

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

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 ,并應(yīng)用到具體索引上。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 就是指匹配到的字段應(yīng)該使用怎樣的 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結(jié)尾的字符串字段。

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

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

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


分享文章:Mapping參數(shù)有哪些
文章來源:http://weahome.cn/article/piccge.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部