欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ElasticSearch學(xué)習(xí)之ES Mapping實(shí)戰(zhàn)示例

 更新時(shí)間:2023年01月31日 14:39:05   作者:程序員皮卡秋  
這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之ES Mapping實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是Mapping

同樣的,我們先講基本概念,什么是mapping,上節(jié)給大家簡(jiǎn)要的舉了一個(gè)例子,還有印象嗎?mapping是es中一個(gè)比較重要的概念,如果這個(gè)搞不懂,下面的學(xué)習(xí)將會(huì)非常的困難。

我們說(shuō)在關(guān)系型數(shù)據(jù)庫(kù)中,比如mysql,在創(chuàng)建表的時(shí)候會(huì)對(duì)字段進(jìn)行聲明,賦予字段一些描述比如字段名稱(chēng),類(lèi)型等。

Es中同樣的,我們之前講Index的時(shí)候就給大家提到過(guò),在創(chuàng)建文檔的時(shí)候同樣需要給文檔進(jìn)行字段聲明,其中包括字段類(lèi)型,是否分詞,是否索引等一系列屬性規(guī)則,而我們今天要講的mapping就是提供這個(gè)作用的。

es中提供了動(dòng)態(tài)mapping靜態(tài)mapping兩種方式來(lái)聲明一個(gè)類(lèi)型中文檔的字段。

下面就給大家做一個(gè)詳細(xì)的講解~

Mapping 屬性

mapping的屬性,可以理解為一個(gè)type中,每個(gè)字段所具備的屬性。下面給大家列一些常用的屬性:

type: 字段類(lèi)型,常用的有 text、integer 等等。

index: 默認(rèn)true,字段是否建立倒排索引,false情況下不能被搜索,但支持聚合分析

enable: 默認(rèn)true,字段是否建立倒排索引以及doc value,false情況下不能被搜索以及聚合,但是節(jié)約了內(nèi)存空間

store: 默認(rèn)false,字段是否額外存儲(chǔ),如果需要查詢(xún)獲取的字段只是文檔中的小數(shù)據(jù),這些字段可以store,減少I(mǎi)O。而且這個(gè)存儲(chǔ)是獨(dú)于 _source 的存儲(chǔ)的。

doc_values: 默認(rèn)true,優(yōu)化字段排序聚合腳本訪問(wèn),耗用磁盤(pán)空間

fields: 多字段特性。讓一個(gè)字段擁有多個(gè)子字段類(lèi)型,使得一個(gè)字段能夠被多個(gè)不同的索引方式進(jìn)行索引。

norms: 默認(rèn)為true,是否支持評(píng)分,如果字段只用來(lái)過(guò)濾和聚合分析,而不需要被評(píng)分,那么可以設(shè)置為false;type 為 text 時(shí),默認(rèn)為 true;而 typekeyword 時(shí),默認(rèn)為 false。

analyzer: 指定索引和搜索時(shí)的分析器,如果同時(shí)指定 search_analyzer 則搜索時(shí)會(huì)優(yōu)先使用 search_analyzer。

search_analyzer: 指定搜索時(shí)的分析器,搜索時(shí)的優(yōu)先級(jí)最高。

fielddata: 默認(rèn)false,針對(duì)text類(lèi)型排序、聚合、腳本訪問(wèn)優(yōu)化,盡量避免,操作昂貴

index_options: 用于設(shè)置倒排(索引)列表包含的信息,這些信息用于搜索(Search)和高亮顯示:

  • docs:只索引文檔編號(hào)(Doc Number);
  • freqs:索引文檔編號(hào)和詞頻率(term frequency);
  • positions:索引文檔編號(hào),詞頻率和詞位置(序號(hào));
  • offsets:索引文檔編號(hào),詞頻率,詞偏移量(開(kāi)始和結(jié)束位置)和詞位置(序號(hào))。

默認(rèn)情況下,被分詞的字符串(analyzed string)字段使用 positions,其他字段默認(rèn)使用 docs。

此外,需要注意的是 index_optionelasticsearch 特有的設(shè)置屬性;臨近搜索和短語(yǔ)查詢(xún)時(shí),index_option 必須設(shè)置為 offsets,同時(shí)高亮也可使用 postings highlighter。 記錄內(nèi)容越多,占用存儲(chǔ)空間越大。

字段類(lèi)型(type)詳解

主要核心數(shù)據(jù)類(lèi)型:

字符串類(lèi)型

  • text

會(huì)做分詞處理。類(lèi)型為 text的字段可以通過(guò)全文檢索搜索到。如果一個(gè)字段是要被全文搜索的,應(yīng)該使用 text 類(lèi)型。設(shè)置 text 類(lèi)型以后,字段內(nèi)容會(huì)被分析,在生成倒排索引以前,字符串會(huì)被分詞器分成一個(gè)一個(gè)詞條(term)。text 類(lèi)型的字段不用于排序,且很少用于聚合(Terms Aggregation 除外)。

  • keyword

不會(huì)做分詞處理。類(lèi)型為 keyword 的字段只能通過(guò)精確值搜索到。類(lèi)型適用于索引結(jié)構(gòu)化的字段,通常用于過(guò)濾、排序、聚合

***PS:Elasticsearch 5.X 之后的字段類(lèi)型不再支持 string,由 text 或 keyword 取代。如果仍使用 string,會(huì)給出警告。 ***

數(shù)字類(lèi)型

byte: 取值范圍 -128 至 127

short 取值范圍 -32768 至 32767

integer 取值范圍 -2^31 至 2^31-1

long 取值范圍 -2^63 至 2^63-1

double 取值范圍 64 位雙精度 IEEE 754 浮點(diǎn)類(lèi)型

float 取值范圍 32 位單精度 IEEE 754 浮點(diǎn)類(lèi)型

half_float 取值范圍 16 位半精度 IEEE 754 浮點(diǎn)類(lèi)型

scaled_float 取值范圍 縮放類(lèi)型的浮點(diǎn)數(shù)

這里需要注意的是,對(duì)于數(shù)字類(lèi)型的字段,在滿足需求的情況下,盡可能選擇范圍小的數(shù)據(jù)類(lèi)型,好比人的年齡,最多就是三位數(shù),使用short就完全能勝任,字段的長(zhǎng)度越短,索引和搜索的效率越高

對(duì)于浮點(diǎn)數(shù)來(lái)說(shuō), 優(yōu)先考慮使用 scaled_float 類(lèi)型。scaled_float 是通過(guò)縮放因子把浮點(diǎn)數(shù)變成 long 類(lèi)型,比如價(jià)格只需要精確到分,price 字段的取值為 57.34,設(shè)置放大因子為 100,存儲(chǔ)起來(lái)就是 5734。所有的 API 都會(huì)把 price 的取值當(dāng)作浮點(diǎn)數(shù),事實(shí)上 Elasticsearch 底層存儲(chǔ)的是整數(shù)類(lèi)型,因?yàn)閴嚎s整數(shù)比壓縮浮點(diǎn)數(shù)更加節(jié)省存儲(chǔ)空間

日期類(lèi)型

  • date

ES 中的日期可以是以下幾種形式:

  • 格式化日期的字符串,如 “2015-01-01” 或 “2015/01/01 12:10:30”
  • 毫秒時(shí)間戳
  • 秒級(jí)時(shí)間戳

需要注意的是,ES內(nèi)部會(huì)把日期轉(zhuǎn)換為 UTC(世界標(biāo)準(zhǔn)時(shí)間),并將其存儲(chǔ)為毫秒時(shí)間戳,這樣做的原因是和字符串相比,數(shù)值在存儲(chǔ)和處理時(shí)更快。

布爾類(lèi)型

  • boolean

如果一個(gè)字段是布爾類(lèi)型,可接受的值為 true、false。

***Elasticsearch 5.4 版本以前,可以接受被解釋為 true 或 false 的字符串和數(shù)字,5.4 版本以后只接受 true、false、”true”、”false”。 ***

二進(jìn)制類(lèi)型

  • binary

binary 類(lèi)型數(shù)據(jù)格式為base64 編碼的字符串,默認(rèn)不額外存儲(chǔ),也不可搜索

范圍類(lèi)型

range

  • integer_range -2^31 至 2^31-1
  • long_range -2^63 至 2^63-1
  • float_range 32-bit IEEE 754
  • double_range 64-bit IEEE 754
  • date_range 64 位整數(shù),毫秒計(jì)時(shí)

復(fù)合數(shù)據(jù)類(lèi)型

這個(gè)或許大家沒(méi)有聽(tīng)過(guò),它主要分為數(shù)組類(lèi)型, 對(duì)象類(lèi)型, 嵌套類(lèi)型

數(shù)組類(lèi)型

ES中沒(méi)有專(zhuān)用的數(shù)組類(lèi)型,默認(rèn)情況下任何字段都可以包含0個(gè)或者多個(gè)值,但是一個(gè)數(shù)組中的值必須是同一種類(lèi)型

  • 整型數(shù)組:[1,3]
  • 嵌套數(shù)組:[1,[2,3]],等價(jià)于 [1,2,3]
  • 對(duì)象數(shù)組: [{"name": "lili", "age": "18"}, {"name": "liming", "age": "20"} ]

動(dòng)態(tài)添加數(shù)據(jù)時(shí),數(shù)組的第一個(gè)值的類(lèi)型決定整個(gè)數(shù)組的類(lèi)型。 混合數(shù)組類(lèi)型是不支持的,比如:[1,”abc”]。數(shù)組可以包含 null 值,空數(shù)組[ ]會(huì)被當(dāng)作 missing field 對(duì)待。

在文檔中使用 array 類(lèi)型不需要提前做任何配置,默認(rèn)支持。

對(duì)象類(lèi)型

對(duì)象類(lèi)型很好理解,即JSON對(duì)象,需要注意的是,es中會(huì)對(duì)嵌套的JSON對(duì)象做扁平化處理, 怎么理解呢?

例如如下數(shù)據(jù):

{
  "name":"lili",
  "friend":[
    "name":"xiaohong"
  ]
}

存儲(chǔ)的時(shí)候變成這樣:

{
  "name":"lili",
  "friend.name":"xiaohong"
}

嵌套類(lèi)型

嵌套類(lèi)型是一種特殊的對(duì)象類(lèi)型,es本身會(huì)對(duì)對(duì)象類(lèi)型字段做扁平化處理,那么當(dāng)存儲(chǔ)的對(duì)象類(lèi)型為對(duì)象數(shù)組時(shí),會(huì)出現(xiàn)關(guān)聯(lián)關(guān)系失效的情況

{
  "name":"lili",
  "friends":[
    {
      "name":"xiaohong",
      "age": 18
    },
    {
      "name":"xiaoming",
      "age": 20
    }
  ]
}

處理后:

{
  "name":"lili",
  "friends.name":["xiaohong","xiaoming"],
  "friend.age":[18, 20]
}

可以看出,數(shù)據(jù)直接的關(guān)聯(lián)性沒(méi)有了

如果需要索引對(duì)象數(shù)組并避免上述問(wèn)題的產(chǎn)生,應(yīng)該使用 nested 對(duì)象類(lèi)型而不是 object 類(lèi)型,nested 對(duì)象類(lèi)型可以保持?jǐn)?shù)組中每個(gè)對(duì)象的獨(dú)立性。Nested 類(lèi)型將數(shù)組中每個(gè)對(duì)象作為獨(dú)立隱藏文檔來(lái)索引,這意味著每個(gè)嵌套對(duì)象都可以獨(dú)立被搜索

為了防止過(guò)度定義嵌套字段的數(shù)量,每個(gè)索引可以定義的嵌套字段被限制在 50 個(gè)

地理數(shù)據(jù)類(lèi)型

地理相關(guān)類(lèi)型有地理坐標(biāo)類(lèi)型(geo_point)和地理圖形類(lèi)型(geo_shape)

地理坐標(biāo)(geo_point)類(lèi)型

geo point 類(lèi)型用于存儲(chǔ)地理位置信息的經(jīng)緯度,可用于以下幾種場(chǎng)景:

  • 查找一定范圍內(nèi)的地理位置。
  • 通過(guò)地理位置或者相對(duì)中心點(diǎn)的距離來(lái)聚合文檔。
  • 把距離因素整合到文檔的評(píng)分中。
  • 通過(guò)距離對(duì)文檔排序。
  • 存儲(chǔ)格式: 經(jīng)緯度JSON格式:{“lat”:41.12,”lon”:-71.34}
  • 經(jīng)緯度字符串格式:"41.12,-71.34"
  • 地理坐標(biāo)hash值:"u1269qu5dcgp"
  • 經(jīng)緯度數(shù)組形式:[41.12,-71.34]

地理圖形(geo_shape)類(lèi)型

這個(gè)不跟大家介紹了,不常用,它的存儲(chǔ)形式是geoJson,如下形式:

{
 "type":"Point",
 "coordinates":[
     100,
     0
 ]
}

特殊類(lèi)型

IP類(lèi)型 (ip)

ip 類(lèi)型的字段用于存儲(chǔ) IPv4 或者 IPv6 的地址。如”192.168.1.1”或”192.168.0.0/16”

令牌計(jì)數(shù)類(lèi)型 (token_count)

token_count 用于統(tǒng)計(jì)text分詞后的詞條個(gè)數(shù),本質(zhì)上是一個(gè)整數(shù)型字段。舉個(gè)例子,映射中指定 name 為 text 類(lèi)型,增加name.length 字段用于統(tǒng)計(jì)分詞后詞項(xiàng)的長(zhǎng)度,類(lèi)型為 token_count,分詞器為標(biāo)準(zhǔn)分詞器,命令如下:

{
  "mappings": {
    "my_type": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "length": {
              "type": "token_count",
              "analyzer": "standard"
            }
          }
        }
      }
    }
  }
}

結(jié)束語(yǔ)

本節(jié)主要講了ES中的mapping概念以及它的基礎(chǔ)屬性,以及給大家介紹了常用的核心數(shù)據(jù)類(lèi)型,本節(jié)理論偏多點(diǎn),所以需要大家動(dòng)手去消化一下,光看很容易忘記,動(dòng)手實(shí)踐印象會(huì)更深。正確的使用類(lèi)型,可以幫助我們更好的解決問(wèn)題,也可以幫我們節(jié)約服務(wù)器成本。本節(jié)還遺留一些東西,放到下節(jié)給大家講,下節(jié)給大家說(shuō)說(shuō)什么是動(dòng)態(tài)mapping,更多關(guān)于ElasticSearch ES Mapping的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論