這篇文章主要介紹“elasticsearch 5.x數據類型與映射的介紹”,在日常操作中,相信很多人在elasticsearch 5.x數據類型與映射的介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”elasticsearch 5.x數據類型與映射的介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
成都創新互聯專注于成都網站制作、成都做網站、網頁設計、網站制作、網站開發。公司秉持“客戶至上,用心服務”的宗旨,從客戶的利益和觀點出發,讓客戶在網絡營銷中找到自己的駐足之地。尊重和關懷每一位客戶,用嚴謹的態度對待客戶,用專業的服務創造價值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
在前面的文章中,我們創建了索引為bank的文檔結構,但是,在創建1000個文檔的時候,并沒有指出他們每個屬性的數據類型。在沒有數據類型映射定義的情況下創建文檔,這在ES中是允許的,因為ES會幫我們自動映射數據類型。但是,在我們的項目中,必須要先定義文檔的數據類型,再操作文檔,因為我們需要根據業務的需要,指定數據的屬性,例如,是否需要全文索引,是否需要分詞,分詞器是什么。
下面我們看下索引bank自動創建文檔數據類型映射成什么?
{ "bank": { "mappings": { "account": { "properties": { "account_number": { "type": "long" }, "address": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "age": { "type": "long" }, "balance": { "type": "long" }, "city": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "email": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "employer": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "firstname": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "gender": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "lastname": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "state": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
上面通過type指定了數據的類型。接下來,我們將開始認識這些數據類型
字段類型概述
一級分類 | 二級分類 | 具體類型 |
---|---|---|
核心類型 | 字符串類型 | text,keyword |
整數類型 | integer,long,short,byte | |
浮點類型 | double,float,half_float,scaled_float | |
邏輯類型 | boolean | |
日期類型 | date | |
范圍類型 | range | |
二進制類型 | binary | |
復合類型 | 數組類型 | array |
對象類型 | object | |
嵌套類型 | nested | |
地理類型 | 地理坐標類型 | geo_point |
地理地圖 | geo_shape | |
特殊類型 | IP類型 | ip |
范圍類型 | completion | |
令牌計數類型 | token_count | |
附件類型 | attachment | |
抽取類型 | percolator |
text 類型:當一個字段是要被全文搜索的,比如Email內容、產品描述,應該使用text類型。設置text類型以后,字段內容會被分析,在生成倒排索引以前,字符串會被分析器分成一個一個詞項。text類型的字段不用于排序,很少用于聚合。
keyword:keyword類型適用于索引結構化的字段,比如email地址、主機名、狀態碼和標簽。如果字段需要進行過濾(比如查找已發布博客中status屬性為published的文章)、排序、聚合。keyword類型的字段只能通過精確值搜索到。
類型 | 取值范圍 |
---|---|
byte | -128~127 |
short | -32768~32767 |
integer | -231~231-1 |
short | -263~263-1 |
在滿足需求的情況下,盡可能選擇范圍小的數據類型。比如,某個字段的取值最大值不會超過100,那么選擇byte類型即可。迄今為止吉尼斯記錄的人類的年齡的最大值為134歲,對于年齡字段,short足矣。字段的長度越短,索引和搜索的效率越高。
類型 | 取值范圍 |
---|---|
doule | 64位雙精度IEEE 754浮點類型 |
float | 32位單精度IEEE 754浮點類型 |
half_float | 16位半精度IEEE 754浮點類型 |
scaled_float | 縮放類型的的浮點數 |
對于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查詢查找-0.0不會匹配+0.0,同樣range查詢中上邊界是-0.0不會匹配+0.0,下邊界是+0.0不會匹配-0.0。
其中scaled_float,比如價格只需要精確到分,price為57.34的字段縮放因子為100,存起來就是5734
優先考慮使用帶縮放因子的scaled_float浮點類型。
日期類型表示格式可以是以下幾種:
(1)日期格式的字符串,比如 “2018-01-13” 或 “2018-01-13 12:10:30”
(2)long類型的毫秒數( milliseconds-since-the-epoch,epoch就是指UNIX誕生的UTC時間1970年1月1日0時0分0秒)
(3)integer的秒數(seconds-since-the-epoch)
進制字段是指用base64來表示索引中存儲的二進制數據,可用來存儲二進制形式的數據,例如圖像。默認情況下,該類型的字段只存儲不索引。二進制類型只支持index_name屬性。
(1)字符數組: [ “one”, “two” ]
(2)整數數組: productid:[ 1, 2 ]
(3)對象(文檔)數組: “user”:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }],
注意:lasticSearch不支持元素為多個數據類型:[ 10, “some string” ]
JSON對象,文檔會包含嵌套的對象
p類型的字段用于存儲IPv4或者IPv6的地址
下面解釋下一些重要的映射屬性
設置此字段能不能被查詢,就是決定要不要將這個字段放進倒排索引裡
若index設置為true(默認是true),則表示這個這個字段會被放進倒排索引裡,如果是text就是分詞過后放進索引,如果是keyword、integer...就直接整段放進索引裡
若index設置為false,則表示這個字段不放進倒排索引裡,因此不能查詢這個字段(因為他不存在于倒排索引裡)
通常這種被設成false的字段,可以想像成是屬于一種附屬的字段,就是不能被match、term查詢,但是當該文檔被其他搜索條件搜出來時,他可以附帶的一起被找出來,因為他們同屬于同一個文檔。
舉個例子,定義user索引的映射
PUT /user { "mappings": { "doc": { "properties": { "name": { "type": "keyword", "index": false }, "uid": { "type": "integer" }, "nickname": { "type": "text", "analyzer": "standard" } } } } }
當搜索uid時,name會一起被找出來
/user/_search { "query": { "term": { "uid": 1 } } }
如果搜索name屬性,將會報錯
GET /user/_search { "query": { "term": { "name": "hugo" } } }
出錯信息如下
"caused_by": { "type": "illegal_argument_exception", "reason": "Cannot search on field [name] since it is not indexed." }
主要用在text類型的字段上,就是設定要使用哪種分詞器來建立索引
可以使用內建的分詞器,或是使用自定義的分詞器
可以使用/_analyze測試分析器具體會將句子分詞成什么樣子,它能幫助我們理解Elasticsearch索引內部發生了什么
GET 127.0.0.1:9200/_analyze { "analyzer": "standard", "text": "Text to analyze" }
官方建議:index time boost is deprecated. Instead, the field mapping boost is applied at query time.
也就是說,官方推薦在查詢時指定boost。
我們可以通過指定一個boost值來控制每個查詢子句的相對權重,該值默認為1。一個大于1的boost會增加該查詢子句的相對權重。boost參數被用來增加一個子句的相對權重(當boost大于1時),或者減小相對權重(當boost介于0到1時),但是增加或者減小不是線性的。換言之,boost設為2并不會讓最終的_score加倍。
POST /bank/_search?pretty { "query": { "match" : { "address": { "query": "mill", "boost": 2 } } } }
查詢結果
{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 4, "max_score": 8.620199, "hits": [ { "_index": "bank", "_type": "account", "_id": "472", "_score": 8.620199, "_source": { "account_number": 472, "balance": 25571, "firstname": "Lee", "lastname": "Long", "age": 32, "gender": "F", "address": "288 Mill Street", "employer": "Comverges", "email": "leelong@comverges.com", "city": "Movico", "state": "MT" } }, { "_index": "bank", "_type": "account", "_id": "136", "_score": 8.532413, "_source": { "account_number": 136, "balance": 45801, "firstname": "Winnie", "lastname": "Holland", "age": 38, "gender": "M", "address": "198 Mill Lane", "employer": "Neteria", "email": "winnieholland@neteria.com", "city": "Urie", "state": "IL" } }, { "_index": "bank", "_type": "account", "_id": "970", "_score": 7.723722, "_source": { "account_number": 970, "balance": 19648, "firstname": "Forbes", "lastname": "Wallace", "age": 28, "gender": "M", "address": "990 Mill Road", "employer": "Pheast", "email": "forbeswallace@pheast.com", "city": "Lopezo", "state": "AK" } }, { "_index": "bank", "_type": "account", "_id": "345", "_score": 7.723722, "_source": { "account_number": 345, "balance": 9812, "firstname": "Parker", "lastname": "Hines", "age": 38, "gender": "M", "address": "715 Mill Avenue", "employer": "Baluba", "email": "parkerhines@baluba.com", "city": "Blackgum", "state": "KY" } } ] } }
當首次創建一個索引的時候,可以指定類型的映射,但假設后來想要增加一個新的映射字段,可以使用/_mapping把新的字段加進mapping映射裡
可以增加一個新的映射,但是不能修改存在的映射,原因是因為這個映射可能有文檔去用,如果改了映射的類型,可能會導致索引的數據出錯,因此只能新加字段進去,不能修改
具體實例
在user映射中的doc類型增加一個新的名為tag的keyword
PUT /user/_mapping/doc { "properties": { "tag": { "type": "keyword", } } }
到此,關于“elasticsearch 5.x數據類型與映射的介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!
分享標題:elasticsearch5.x數據類型與映射的介紹
轉載來于:http://m.newbst.com/article24/pjsoce.html
成都網站建設公司_創新互聯,為您提供全網營銷推廣、微信小程序、網站改版、品牌網站建設、標簽優化、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯