千家信息网

ElasticSearch的映射mapping是什么

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这篇文章主要讲解了"ElasticSearch的映射mapping是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"ElasticSearch的映射
千家信息网最后更新 2024年11月26日ElasticSearch的映射mapping是什么

这篇文章主要讲解了"ElasticSearch的映射mapping是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"ElasticSearch的映射mapping是什么"吧!

1、什么是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参数。
• 解决:将索引从多类型迁移到单类型,每种类型文档一个独立索引

2、查看mapping

GET /[index_name]/_mapping

3、创建一个mapping

PUT /my-index-000001{  "mappings": {    "properties": {      "age":    { "type": "integer" },        "email":  { "type": "keyword"  },       "name":   { "type": "text"  }         }  }}

说明:

integer:数字类型,默认是long

keyword:检索时只能精确匹配

text:全文检索,保存数据时会进行分词

4、添加新的字段映射

PUT /my-index-000001/_mapping{  "properties": {    "employee-id": {      "type": "keyword",      "index": false    }  }}

说明

index:默认是true,被索引,也就是参与检索,这边设为false,说明该字段不参与检索。

5、更新字段映射

对于已经存在的映射字段, 禁止直接修改 。更新必须创建新的索引进行数据迁移。 因为 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}

6、数据迁移

6.1、创建出新的映射。

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"        }      }    }  }

6.2、迁移

POST _reindex{  "source": {    "index": "bank",    "type": "account"  },  "dest":{    "index": "newbank"  }}

7、copy_to参数说明

作用是将该字段的值复制到目标字段,不会出现在_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是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0