这篇文章主要讲解了“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是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/3227593/blog/4633187