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是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!