ElasticSearch學(xué)習(xí)之ES Mapping實(shí)戰(zhà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;而 type
為 keyword
時(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_option
是 elasticsearch
特有的設(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)文章
SpringCloud turbine監(jiān)控實(shí)現(xiàn)過程解析
這篇文章主要介紹了SpringCloud turbine監(jiān)控實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12JAVA實(shí)現(xiàn)利用第三方平臺發(fā)送短信驗(yàn)證碼
本文以注冊為例,在SpringMVC+Spring+Mybatis框架的基礎(chǔ)上完成該短信驗(yàn)證碼功能。需要的朋友一起來看下吧2016-12-12Socket與ServerSocket類構(gòu)造方法與API
今天小編為大家整理了Socket與ServerSocket類構(gòu)造方法與API,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值。需要的朋友可以收藏下,方便下次瀏覽觀看2021-12-12一篇文章掌握J(rèn)ava?Thread的類及其常見方法
Thread類用于操作線程,是所以涉及到線程操作(如并發(fā))的基礎(chǔ)。本文將通過代碼對Thread類的功能作用及其常見方法進(jìn)行分析2022-03-03Java Web基于Session的登錄實(shí)現(xiàn)方法
這篇文章主要介紹了Java Web基于Session的登錄實(shí)現(xiàn)方法,涉及Java針對session的操作及表單提交與驗(yàn)證技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10jenkins+maven+svn自動(dòng)部署和發(fā)布的詳細(xì)圖文教程
Jenkins是一個(gè)開源的、可擴(kuò)展的持續(xù)集成、交付、部署的基于web界面的平臺。這篇文章主要介紹了jenkins+maven+svn自動(dòng)部署和發(fā)布的詳細(xì)圖文教程,需要的朋友可以參考下2020-09-09