您好,登錄后才能下訂單哦!
這篇文章主要講解了“ElasticSearch的映射mapping是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ElasticSearch的映射mapping是什么”吧!
mapping是類似于數據庫中的表結構定義,主要作用如下:
定義index下的字段名
定義字段類型,比如數值型、浮點型、布爾型等
定義倒排索引相關的設置,比如是否索引、記錄position等
在具體介紹mapping前,有個概念必須先了解:ElasticSearch7-去掉type概念
? 關系型數據庫中兩個數據表示是獨立的,即使他們里面有相同名稱的列也不影響使用,但ES中不是這樣的。 elasticsearch是基于Lucene開發的搜索引擎,而ES中不同type下名稱相同
的filed最終在Lucene中的處理方式是一樣的。
? 兩個不同type下的兩個user_name,在ES同一個索引下其實被認為是同一個filed,你必
須在兩個不同的type中定義相同的filed映射。否則,不同type中的相同字段名稱就會在
處理中出現沖突的情況,導致Lucene處理效率下降。
? 去掉type就是為了提高ES處理數據的效率。
? Elasticsearch 7.x
? URL中的type參數為可選。比如,索引一個文檔不再要求提供文檔類型。
? Elasticsearch 8.x
? 不再支持URL中的type參數。
? 解決:將索引從多類型遷移到單類型,每種類型文檔一個獨立索引
GET /[index_name]/_mapping
PUT /my-index-000001 { "mappings": { "properties": { "age": { "type": "integer" }, "email": { "type": "keyword" }, "name": { "type": "text" } } } }
說明:
integer:數字類型,默認是long
keyword:檢索時只能精確匹配
text:全文檢索,保存數據時會進行分詞
PUT /my-index-000001/_mapping { "properties": { "employee-id": { "type": "keyword", "index": false } } }
說明
index:默認是true,被索引,也就是參與檢索,這邊設為false,說明該字段不參與檢索。
對于已經存在的映射字段, 禁止直接修改 。更新必須創建新的索引進行數據遷移。 因為 lucene實現的倒排索引生成后不允許修改,應該重新建立新的索引,然后做reindex操作。
但是可以新增字段,通過 dynamic 參數來控制字段的新增,這個參數的值如下:
true:默認值,表示允許選自動新增字段
false:不允許自動新增字段,但是文檔可以正常寫入,但無法對字段進行查詢等操作
strict:嚴格模式,文檔不能寫入,報錯
首先創建名為 my_dynamic_false的索引并設置mapping:
PUT my_dynamic_false { "mappings": { "dynamic": false, "properties": { "title": { "type": "text" }, "name": { "type": "keyword" }, "age": { "type": "integer" } } } }
然后寫入一個文檔:
PUT my_dynamic_false/_doc/1 { "title": "hello world", "desc": "this is book" }
注意,這里在mapping設置中,”dynamic”: false,表示在寫入文檔時,如果寫入字段不存在也不會報錯。這里的desc字段就是不存在的字段。
查詢一下寫入的文檔:
GET my_dynamic_false/_search { "query": { "match": { "title": "hello" } } }
結果: 可以通過 title字段查詢到文檔的內容
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.2876821, "hits" : [ { "_index" : "my_dynamic_false", "_type" : "_doc", "_id" : "1", "_score" : 0.2876821, "_source" : { "title" : "hello world", "desc" : "this is book" } } ] } }
通過desc字段查詢文檔
GET my_dynamic_false/_search { "query": { "match": { "desc": "book" } } }
結果是查不到
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } }
驗證一下”dynamic”: strict模式:
創建mapping
PUT my_dynamic_strict { "mappings": { "dynamic": "strict", "properties": { "title": { "type": "text" }, "name": { "type": "keyword" }, "age": { "type": "integer" } } } }
創建文檔
PUT my_dynamic_strict/_doc/1 { "title": "hello world", "desc": "this is book" }
結果發現直接報錯了
{ "error": { "root_cause": [ { "type": "strict_dynamic_mapping_exception", "reason": "mapping set to strict, dynamic introduction of [desc] within [_doc] is not allowed" } ], "type": "strict_dynamic_mapping_exception", "reason": "mapping set to strict, dynamic introduction of [desc] within [_doc] is not allowed" }, "status": 400 }
PUT /newbank { "mappings" : { "properties" : { "account_number" : { "type" : "long" }, "address" : { "type" : "text" }, "age" : { "type" : "integer" }, "balance" : { "type" : "long" }, "city" : { "type" : "keyword" }, "email" : { "type" : "keyword" }, "employer" : { "type" : "keyword" }, "firstname" : { "type" : "text" }, "gender" : { "type" : "text" }, "lastname" : { "type" : "text" }, "state" : { "type" : "keyword" } } } }
POST _reindex { "source": { "index": "bank", "type": "account" }, "dest":{ "index": "newbank" } }
作用是將該字段的值復制到目標字段,不會出現在_source中,只能用來搜索。
PUT my_index_copy { "mappings": { "properties": { "first_name": { "type": "text" , "copy_to": "full_name" }, "last_name": { "type": "text" , "copy_to": "full_name" }, "full_name" : { "type": "text" } } } }
然后創建一個新的文檔,文檔只需要寫first_name 和 last_name即可:
PUT my_index_copy/_doc/1 { "first_name": "john", "last_name": "smith" }
查詢:
GET my_index_copy/_search { "query": { "match": { "full_name": { "query": "john smith" } } } }
結果可以查到數據,但結果集中沒有full_name
{ "took" : 5, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.5753642, "hits" : [ { "_index" : "my_index_copy", "_type" : "_doc", "_id" : "1", "_score" : 0.5753642, "_source" : { "first_name" : "john", "last_name" : "smith" } } ] } }
感謝各位的閱讀,以上就是“ElasticSearch的映射mapping是什么”的內容了,經過本文的學習后,相信大家對ElasticSearch的映射mapping是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。