elasticsearch中文档映射Mapping用法详解

这篇具有很好参考价值的文章主要介绍了elasticsearch中文档映射Mapping用法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mapping类似数据库中的schema的定义,作用如下:

  • 定义索引中的字段的名称
  • 定义字段的数据类型,例如字符串,数字,布尔等
  • 字段,倒排索引的相关配置(Analyzed or Not Analyzed,Analyzer)

ES中Mapping映射可以分为动态映射和静态映射。

动态映射:

        在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而Elasticpearch中不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

        动态映射(Dynamic Mapping)的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型。但是有时候会推算的不对,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询

静态映射:

        静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射。

Dynamic Mapping类型自动识别:

JSON类型 ElasticSearch类型
字符串 
  • 匹配日期格式,设置为Date
  • 匹配数字设置为float或者long,该选项默认关闭
  • 设置为Text,并且增加keyword字段
布尔值 boolean
浮点数 float
整数 long
对象 Object
数组 由第一个非空数值的类型所决定
空值 忽略

动态映射:

创建文档(es根据数据类型,会自动创建映射)

# 创建文档(es根据数据类型,会自动创建映射)
PUT /user/_doc/1
{
  "name": "张三",
  "age": 26,
  "address": "北京市朝阳区"
}

运行结果:

{
  "_index" : "user",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

获取文档映射

# 获取文档映射
GET /user/_mapping

运行结果:

{
  "user" : {
    "mappings" : {
      "properties" : {
        "address" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Mapping一旦建立后,那后期是否还可以更新或者修改Mapping字段类型信息呢?

情况一:新增加字段

  • dynamic设为true时,一旦有新增字段的文档写入,Mapping 也同时被更新
  • dynamic设为false,Mapping 不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
  • dynamic设置成strict(严格控制策略),文档写入失败,抛出异常

es mapping,ElasticSearch,elasticsearch,大数据,搜索引擎

情况二:对于已有字段,一旦已经有数据写入,就不再支持修改字段定义

  • Lucene实现的倒排索引,—旦生成后,就不允许修改
  • 如果希望改变字段类型,必须Reindex API,重建索引

        如果修改了字段的数据类型,会导致已被索引的数据无法被搜索;但是如果是增加新的字段,就不会有这样的影响。

首先新建mapping信息:

PUT user2
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "name": {
        "type": "text"
      },
      "address": {
        "type": "object",
        "dynamic": "true"
      }
    }
  }
}

运行结果:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "user2"
}

插入新的文档,原因为age为新增字段报错,抛出异常,之前mapping中dynamic设置的为strict

# 插入新的文档,原因为age为新增字段报错,抛出异常,之前mapping中dynamic设置的为strict
PUT user2/_doc/1
{
  "name": "张三",
  "age": 26,
  "address": {
    "provienc": "北京市",
    "city": "北京市"
  }
}

运行结果:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "strict_dynamic_mapping_exception",
        "reason" : "mapping set to strict, dynamic introduction of [age] within [_doc] is not allowed"
      }
    ],
    "type" : "strict_dynamic_mapping_exception",
    "reason" : "mapping set to strict, dynamic introduction of [age] within [_doc] is not allowed"
  },
  "status" : 400
}

接下来修改dynamic信息,更改为true后再次执行上面的语句:

# 修改mapping信息
PUT user2/_mapping
{
  "dynamic": "true"
}

运行结果:

{
  "acknowledged" : true
}

dynamic修改为true后,再次插入一个新的文档

# dynamic修改为true后,再次插入一个新的文档
PUT user2/_doc/1
{
  "name": "张三",
  "age": 26,
  "address": {
    "provienc": "北京市",
    "city": "北京市"
  }
}

运行结果:

{
  "_index" : "user2",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

添加新字段后,再次查询mapping信息

# 添加新字段后,再次查询mapping信息
GET user2/_mapping

运行结果:  【可以看出新增加了age字段的信息】

{
  "user2" : {
    "mappings" : {
      "dynamic" : "true",
      "properties" : {
        "address" : {
          "dynamic" : "true",
          "properties" : {
            "city" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "provienc" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

对已经存在的mapping映射进行修改:

具体方法:

  1. 如果要推倒现有的映射,你得重新建立—个静态索引
  2. 然后把之前索引里的数据导入到新的索引里
  3. 删除原创建的索引
  4. 为新索引起个别名,为原索引名

注意:通过上述4个步骤实现了索引的平滑过渡,并且是零停机!

1.重新创建一个静态索引,并将数据迁移到新索引中

# 重新创建一个静态索引
POST _reindex
{
  "source": {
    "index": "user2"
  },
  "dest": {
    "index": "new_user2"
  }
}

运行结果:

{
  "took" : 185,
  "timed_out" : false,
  "total" : 1,
  "updated" : 0,
  "created" : 1,
  "deleted" : 0,
  "batches" : 1,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}

2.查看新索引mapping信息

# 查看新索引mapping信息
GET new_user2/_mapping

运行结果:   【新索引和旧索引mapping信息是相同的】

{
  "new_user2" : {
    "mappings" : {
      "properties" : {
        "address" : {
          "properties" : {
            "city" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "provienc" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

3.查看新索引的数据信息

# 查看新索引的数据信息
GET new_user2/_search

运行结果:  【新索引已经包含了旧索引所有的数据】

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "new_user2",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 26,
          "address" : {
            "provienc" : "北京市",
            "city" : "北京市"
          }
        }
      }
    ]
  }
}

4.删除之前的旧索引

# 删除旧索引
DELETE user2

运行结果:

{
  "acknowledged" : true
}

5.为新索引起个别名,别名为旧索引的名称

# 为新索引起别名
PUT new_user2/_alias/user2

运行结果:

{
  "acknowledged" : true
}

注意:起别名前要确保别名不是已经存在的索引,如果存在则报错!这也是起别名之前先删除旧索引的原因! 

6.查询旧索引(即为新索引的别名)

# 查询旧索引(即为新索引的别名)
GET user2

# 效果等同于 GETuser2
GET new_user2

运行结果:

{
  "new_user2" : {
    "aliases" : {
      "user2" : { }
    },
    "mappings" : {
      "properties" : {
        "address" : {
          "properties" : {
            "city" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "provienc" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : "new_user2",
        "creation_date" : "1667317074691",
        "number_of_replicas" : "1",
        "uuid" : "rvKsAyTKQeuc-bWklCW-8A",
        "version" : {
          "created" : "7170699"
        }
      }
    }
  }
}

注意:新起的别名是不能DELETE的!抛出异常!文章来源地址https://www.toymoban.com/news/detail-596994.html

到了这里,关于elasticsearch中文档映射Mapping用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch学习-索引操作及Mapping映射

    在7.X版本前类似于关系型数据库中的数据库概念,8.X版本后删除了type概念,索引类似于关系型数据库中的表 相当于关系型数据库中的一条数据,最小单元 每一个节点就是一个ES实例(一个java进程),一个节点 != 一台服务器 多个节点组成分布式系统,ES原生分布式,已启动一

    2023年04月22日
    浏览(42)
  • 深入理解Elasticsearch的索引映射(mapping)

    当我们谈论Elasticsearch时,索引映射是一个核心概念,它定义了如何存储和检索数据。在Elasticsearch 7.6及更高版本中,映射提供了一系列强大的功能,使您能够精确地控制数据的结构和行为。本文将详细介绍映射的关键属性、用途以及如何正确设置和优化它。 在Elasticsearch中,

    2024年02月22日
    浏览(47)
  • Elasticsearch:映射(mapping)的实用实践指南

    动态映射适用于开发环境,但对于生产级集群禁用它。 将动态配置为 “strict” 以对索引的字段值实施严格模式。有关动态映射的详细描述,请阅读文章 “Elasticsearch:Dynamic mapping”。 当文档大量存储时,可以在定义字段映射时使用优化来节省磁盘空间。 禁用强制(coerce)。

    2024年02月12日
    浏览(40)
  • Elasticsearch:Explicit mapping - 显式映射

    显式映射相比较动态映射(Dynamic mapping)是需要我们在索引创建时就定义字段及其类型。这个和我们传统的 RDMS 数据库一样,在我们写入数据到数据库之前,我们需要工整地定义好每个字段及其类型和长度。Elasticsearch 既可以使用显式映射也可以同时使用动态映射。在许多的

    2024年02月02日
    浏览(46)
  • ES mapping映射属性_source、_all、store和index

    这个说的比较清楚 图解Elasticsearch中的_source、_all、store和index属性_esc_ai的博客-CSDN博客

    2024年02月15日
    浏览(40)
  • ES mapping 详解

    nested 类型??? _all _routing; ES-mapping Elasticsearch mapping_Aska小强的博客-CSDN博客 Mapping 类似 mysql 中的 schema 的定义,就是定义索引属性字段的 定义索引中字段的名称 定义索引中字段的数据类型 , 如 text , long , keyword.... 定义索引中字段的的倒排索引相关配置 ( Analyzer...) 一个Mappin

    2024年02月06日
    浏览(24)
  • Elasticsearch(ES)(版本7.x)创建索引报错:Faile to parse mapping [_doc] Root mapping definition has unsupported

    Elasticsearch(ES)(版本7.x)创建索引报错: 因es7.0版本之后不再需要type doc,把上面语句中的doc删掉,再运行就可以创建索引了。 如果还需要type doc则需要增加include_type_name=true即可解决。 示例:

    2024年02月16日
    浏览(43)
  • Mapping映射入门

    概念:自动或手动为index中的_doc建立的一种数据结构和相关配置,简称为mapping映射。 插入几条数据,让es自动为我们建立一个索引 对比数据库建表语句 动态映射:dynamic mapping,自动为我们建立index,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等

    2023年04月08日
    浏览(40)
  • (4)Mapping(映射)

    映射是定义文档及其包含的字段的存储和索引方式的过程。 两种映射方式 dynamic mapping(动态映射或自动映射) expllcit mapping(静态映射或手工映射或显示映射) Mapping数据类型 Mapping参数 https://www.elastic.co/guide/en/elasticsearch/reference/7.10/removal-of-types.html Mapping 也称之为映射,定义

    2024年02月01日
    浏览(36)
  • 4. 对象映射 - Mapping.Mapster

    在项目中我们会经常遇到对象的映射,比如像Model和Dto之间的映射,或者是对象的深拷贝,这些都是需要我们自己实现的。此时,项目中会出现很多初始化对象的代码,这些代码写起来相当的枯燥乏味,那么有没有什么办法减轻我们的工作量,使得我们可以把时间花费到业务

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包