欧美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é)給大家簡要的舉了一個(gè)例子,還有印象嗎?mapping是es中一個(gè)比較重要的概念,如果這個(gè)搞不懂,下面的學(xué)習(xí)將會非常的困難。

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

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

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

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

Mapping 屬性

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

type: 字段類型,常用的有 text、integer 等等。

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

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

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

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

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

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

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

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

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

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

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

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

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

字段類型(type)詳解

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

字符串類型

  • text

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

  • keyword

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

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

數(shù)字類型

byte: 取值范圍 -128 至 127

short 取值范圍 -32768 至 32767

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

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

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

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

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

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

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

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

日期類型

  • date

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

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

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

布爾類型

  • boolean

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

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

二進(jìn)制類型

  • binary

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

范圍類型

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ù)類型

這個(gè)或許大家沒有聽過,它主要分為數(shù)組類型, 對象類型, 嵌套類型

數(shù)組類型

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

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

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

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

對象類型

對象類型很好理解,即JSON對象,需要注意的是,es中會對嵌套的JSON對象做扁平化處理, 怎么理解呢?

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

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

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

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

嵌套類型

嵌套類型是一種特殊的對象類型,es本身會對對象類型字段做扁平化處理,那么當(dāng)存儲的對象類型為對象數(shù)組時(shí),會出現(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)性沒有了

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

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

地理數(shù)據(jù)類型

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

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

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

  • 查找一定范圍內(nèi)的地理位置。
  • 通過地理位置或者相對中心點(diǎn)的距離來聚合文檔。
  • 把距離因素整合到文檔的評分中。
  • 通過距離對文檔排序。
  • 存儲格式: 經(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)類型

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

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

特殊類型

IP類型 (ip)

ip 類型的字段用于存儲 IPv4 或者 IPv6 的地址。如”192.168.1.1”或”192.168.0.0/16”

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

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

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

結(jié)束語

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

相關(guān)文章

最新評論