<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本篇主要介紹一下 Elasticsearch mapping 的概念, 它是什麼 以及如何自定義它, 並且再介紹一下 dynamic 的機制
如果把 Elasticsearch中的mapping 對比到 mysql 中 就是 mysql中的 表的 scheme , 就是表的定義結構,
正常在 關係型資料庫mysql中 需要先把表的scheme 定義好 再插入資料, 並且 你無法插入未在scheme 中定義的欄位 , 而 es 中 可以在你未給索引定義 mapping 的時候 自動幫你建立 mapping , 並且你也可以通過 dynamic 來控制是否允許靈活動態的 新增 mapping中的屬性
Mapping 類似 mysql 中的 schema 的定義,就是定義索引屬性欄位的
一個Mapping 屬於一個索引的Type
當我們去建立一個 索引的時候 未指定 mapping , es會預設幫這個索引建立一個 mapping
建立一個 索引並且索引一條資料
PUT blog/_doc/1 { "name": "es mapping", "type": "es", "desc": "es mapping desc", "author": "johnny", "word_count": 50, "create_time": "2022-10-31" }
GET blog/_mapping # 檢視一個 es自動生成的 mapping
從上面可以看出來 屬性都被es 自動建立了 對應的mapping , 包括每個屬性的type型別等, 那它為什麼會這樣轉化的,什麼時候是 text, 什麼時候是 long 下面就來介紹 es 中mapping 的 型別自動識別
JSON型別 | Elasticsearch 型別 |
---|---|
字串 | 1.匹配日期格式 會設定成Date 2.匹配數位 設定成 float 或者 long ,該選項預設關閉的 3.設定成Text , 並且新增 keyword 子欄位 |
整數 | long |
浮點數 | float |
布林值 | boolean |
物件 | object |
陣列 | 由第一個非空數值的型別所定義 .如 ["jack","johnny"] 則型別為 Text |
空值 | 忽略 ??? 我實驗的版本里7.18 , 如果設定null 會被自動定義為Text , 具體不太清楚 |
除了上面的介紹的 es 自動建立 mapping 外, 還可以自定義 索引的mapping , 更加靈活和符合業務需求等等.
注意以前的版本需要在 mappings 下面還有一層 type , 如 mappings: { "_doc" : { "properties" : {xxx} }} 但是7.0之後 type就不需要了
PUT blog_info { "mappings": { "properties": { "blog_name": { "type": "keyword" }, "blog_desc": { "type": "text" }, "blog_word_count": { "type": "long" }, "create_time": { "type": "date" } } } }
其中text和keyword型別,text型別的欄位在新增或修改檔案時會自動分詞, 而keyword 不會,它會儲存插入的原始文字
索引一條資料
PUT blog_info/_doc/1 { "blog_name": "es mapping", "blog_desc": "es mapping desc", "blog_word_count": 12, "blog_auther": "johnny", "create_time": "2022-10-31" }
預設分詞器 standard , 它會把中文一個個拆開,肯定是不適合的,如果是索引中文的資訊, 需要設定欄位的分詞器
PUT blog_info { "mappings": { "properties": { "blog_desc": { "type": "text", "analyzer": "ik_smart" //設定這個欄位的分詞器 } } } }
大部分分詞器是需要以es 中外掛的方式 安裝的 ,後續會出一篇專門的 analyzer 分詞器
在es搜尋的時候 會有一個相關性算分的過程 , 如果不設定 每個欄位的預設boost 權重為1.0 , 如果希望加大 按照廣告投放金額的分 那麼可以設定boost 以提高搜尋 自然就排在前面了
PUT blog_info { "mappings": { "properties": { "put_amount": { "type": "text", "boost": "5" } } } }
該屬性允許多個欄位 copy 到指定的欄位, 可以進行搜尋這個欄位,但是_source 中是不顯示的
PUT peope { "mappings": { "properties": { "first_name": { "type": "text", "copy_to": "full_name" }, "last_name":{ "type": "text", "copy_to": "full_name" // copy_to 指定欄位 }, "full_name":{ "type": "text" } } } }
GET peope/_search?q=full_name:johnny //使用 full_name 去搜尋 //可以看到 並沒有 full_name 的返回 但是可以通過它去搜尋 "_source" : { "first_name" : "johnny", "last_name" : "qiang" }
通過給 屬性設定 index 來控制該 欄位是否 參與 索引, 預設 true , 如果index 設定為false 那麼 不能記錄索引 並且不可以搜尋
PUT peope { "mappings": { "properties": { "first_name": { "type": "text", "index": false //設定 index false }, "last_name":{ "type": "text" } } } } POST peope/_doc { "first_name": "johnny is good name", "last_name": "qiang" }
注意 url-search 搜不到但是不報錯, 而 requestbody 查詢 index false 的欄位 會報錯
GET peope/_search?q=first_name:johnny //搜尋不到資料 因為 //"hits" : [ ] GET peope/_search?q=last_name:johnny // 可以看到由於 last_name 預設index 了 所以可以搜尋到 // "hits" : [ // { // "_index" : "peope", // "_type" : "_doc", // "_id" : "vobiMYQB4x9Wk60f2F21", // "_score" : 0.2876821, // "_source" : { // "first_name" : "johnny is good name", // "last_name" : "johnny is good name" // } // } // ] GET peope/_search { "query": { "match": { "first_name": "johnny" } } } // 拋錯400 Cannot search on field [first_name] since it is not indexed.
null_value:當欄位遇到null值時候的處理策略(欄位為null時候是不能被搜尋的,也就是說,text型別的欄位不能使用該屬性,可以使用在keyword 欄位上),設定該值後可以用你設定的值替換null值,這點可類比mysql中的"default"設定預設值, 但是也有點不一樣, 後續就可以使用你設定的這個 null_value 去搜尋, 但是檢索出來的資料_source 中 還是展示 null
PUT peope { "mappings": { "properties": { "first_name": { "type": "keyword", "null_value": "default" // 設定當 檔案的first_name 欄位為null時候 轉成default 去建立倒排索引 }, "last_name":{ "type": "text" } } } } POST peope/_doc { "first_name": null, //設定null值 "last_name": "johnny is good name", "full_name": "johnny is good name" } GET peope/_search?q=first_name:default //根據 null_value 設定的值去搜尋,查詢出來還是原來的null // { // "_index" : "peope", // "_type" : "_doc", // "_id" : "xob-MYQB4x9Wk60fVF1_", // "_score" : 0.2876821, // "_source" : { // "first_name" : null, // "last_name" : "johnny is good name", // "full_name" : "johnny is good name" // } // }
dynamic 是否允許動態新增欄位
對於已經存在的欄位 一旦又資料寫入,就不能進行修改欄位定義了,因為 底層Lucene不允許修改, 如果希望修改欄位型別,必須 reindex 重建索引
PUT peope { "mappings": { "dynamic": false, // 設定在索引上的 而不是對應的欄位上的 "properties": { "first_name": { "type": "text" }, "last_name":{ "type": "text" } } } } POST peope/_doc //dynamic false 可以入庫檔案資料 { "first_name": "johnny is good name", "last_name": "johnny is good name", "full_name": "johnny is good name" } GET peope/_search?q=full_name:johnny //嘗試通過 新增的欄位去搜尋 // "hits" : [ ] GET peope/_search?q=first_name:johnny // 可以搜到資料, 並且_source 中可以看到新增的欄位 // // "hits" : [ // { // "_index" : "peope", // "_type" : "_doc", // "_id" : "vobiMYQB4x9Wk60f2F21", // "_score" : 0.2876821, // "_source" : { // "first_name" : "johnny is good name", // "last_name" : "johnny is good name", // "full_name" : "johnny is good name" // } // } // ]
strict : 嚴格模式 , 不允許 動態新增欄位的
PUT peope { "mappings": { "dynamic": "strict", "properties": { "first_name": { "type": "text" }, "last_name":{ "type": "text" } } } } POST peope/_doc //直接拋錯 { "first_name": "johnny is good name", "last_name": "johnny is good name", "full_name": "johnny is good name" } // 400 mapping set to strict, dynamic introduction of [full_name] within [_doc] is not allowed
本篇非常詳細介紹了 Elasticsearch中 mapping , 介紹了mapping它是什麼, 自動建立mapping的機制 , 自定義mapping 中各種引數設定. 一起來學習鞏固吧.
以上就是Elasticsearch mapping 概念及自動建立範例的詳細內容,更多關於Elasticsearch mapping自動建立的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45