【ElasticSearch-基础篇】Mapping结构

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

【ElasticSearch-基础篇】Mapping结构,ElasticSearch,elasticsearch,大数据,搜索引擎

1.什么是Mapping

Mapping 类似 mysql 中的 schema 的定义
用于定义索引属性字段的名称、字段的数据类型 (如 text , long , keyword…)、字段的倒排索引相关配置
一个Mapping 属于一个索引的Type、每个文档都属于一个Type
es7.0开始, 在Mapping中不需要指定 Type信息, 因为7.0之后只有_doc Type

2.自动创建Mapping

当我们去创建一个 索引的时候 未指定 mapping , es会默认帮这个索引创建一个 mapping
例:创建一个索引testmapping

创建一个空索引:

PUT testmapping

创建成功:

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

查询该索引mapping信息:

GET testmapping/_mapping

返回结果:

{
  "testmapping" : {
    "mappings" : { }
  }
}

此时可以看到ES为我们创建了一个空mapping的索引,如果我们在创建索引的时候指定字段,ES也会生成我们指定的字段类型,或者默认的类型

创建名为user的索引,并指定字段及字段类型

PUT /user
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "language": {
        "type": "keyword"
      },
      "price": {
        "type": "double"
      },
      "publish_time": {
        "type": "date",
        "format": "yyy-MM-dd"
      }
    }
  }
}

获取user的mapping信息

GET user/_mapping

{
  "user" : {
    "mappings" : {
      "properties" : {
        "language" : {
          "type" : "keyword"
        },
        "price" : {
          "type" : "double"
        },
        "publish_time" : {
          "type" : "date",
          "format" : "yyy-MM-dd"
        },
        "title" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        }
      }
    }
  }
}

动态映射(dynamic mapping)

关系型数据库: 先创建表 => 指定字段和字段类型 => 数据写入表
在ES中,索引就相当于表,文档就相当于记录,文档里面的字段就相当于表的字段,字段同样有数据类型。mapping就用来定义文档有哪些字段,这些字段如何存储和索引。

ES与关系型数据库不同之处在于: 其不需要先定义表结构,而可以根据写入文档的内容,来推断字段和数据类型,创建索引结构,这就是dynamic mapping,动态映射的由来。这提供了极大的灵活性。
注:一个索引的字段数量有上限的,超过上限就会报错(默认单个索引创建最大1000个字段)

dynamic参数设置:
按dynamic值,可分为下面三种模式

动态模式(dynamic:true),根据输入文档的内容,自动推断字段和类型,创建mapping
非动态模式(dynamic:false),无法根据输入文档的内容,自动创建mapping,需要手动创建mapping
严格模式(dynamic:strict),同非动态模式,区别在于,非动态模式,输入的文档中如果有字段不在mapping中,依然可以存储和读取,但是该字段不在mapping中,因此也无法根据该字段进行检索;但严格模式,无法存储,会直接报错,严格模式实际上就类似于关系型数据库中的表了。

1.动态模式

直接对一个不存在的索引插入一条数据

POST dynamictrue/_doc
{
  "name": "张三",
  "age": 15
}

插入成功,获取该索引的mapping信息

GET dynamictrue/_mapping

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

在动态模式下,ES会根据插入的数据自动生成对应的字段类型,也可以通过动态模板(dynamic template)来覆盖这个规则,实现自定义推测规则,具体可以参考ES官网

1.1动态模式下索引文档

GET dynamictrue/_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" : "dynamictrue",
        "_type" : "_doc",
        "_id" : "ulYk54wBAEWV3dbHq4Dj",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}

结论: 动态模式下索引文档是有数据返回的

1.2动态模式下索引字段

-- 查询当前索引下age是15的数据
GET dynamictrue/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "age": {
              "value": 15
            }
          }
        }
      ]
    }
  }
}

返回值:
{
  "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" : "dynamictrue",
        "_type" : "_doc",
        "_id" : "ulYk54wBAEWV3dbHq4Dj",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}

结论: 动态模式下索引字段也是可以的

1.3动态模式下变更Mapping

新增一个字段
POST dynamictrue/_doc
{
  "addr": "地址"
}

成功新增名为addr的字段
GET dynamictrue/_mapping

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

2.非动态模式

新建一个索引(dynamicfalse)并设置dynamic为false

PUT dynamicfalse
{
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      }
    }
  }
}

查询索引(dynamicfalse)的mapping信息

GET dynamicfalse/_mapping

{
  "dynamicfalse" : {
    "mappings" : {
      "dynamic" : "false",
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

此时可以看到返回结果中dynamic已经被设置成false

此时我们对该索引新增一条数据

POST dynamicfalse/_doc
{
  "name": "张三",
  "age": 15
}

2.1非动态模式下索引文档

GET dynamicfalse/_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" : "dynamicfalse",
        "_type" : "_doc",
        "_id" : "hFYi54wBAEWV3dbHdYDM",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}

结论: 非动态模式下索引文档是有数据返回的

2.2非动态模式下索引字段

GET dynamicfalse/_search
{
  "query": {
    "match": {
      "age": 15
    }
  }
}

返回结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "dynamicfalse",
        "_type" : "_doc",
        "_id" : "z1a154wBAEWV3dbHQYzt",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}

结论: 非动态模式下索引字段是可以的,但是只针对查询在mapping中存在的字段生效,如果字段不存在mapping,无法生效,请往下看↓

2.3非动态模式下变更Mapping

在当前索引中插入一个addr字段的数据
POST dynamicfalse/_doc
{
  "addr": "地址"
}

插入成功后,查询当前索引mapping信息
GET dynamicfalse/_mapping

{
  "dynamicfalse" : {
    "mappings" : {
      "dynamic" : "false",
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}
可以发现非动态模式下新增的字段并没有在mapping中生成

此时查询当前索引中数据

GET dynamicfalse/_search

返回数据如下:
{
  "took" : 537,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "dynamicfalse",
        "_type" : "_doc",
        "_id" : "cVa654wBAEWV3dbHtI3g",
        "_score" : 1.0,
        "_source" : {
          "addr" : "地址"
        }
      },
      {
        "_index" : "dynamicfalse",
        "_type" : "_doc",
        "_id" : "z1a154wBAEWV3dbHQYzt",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}
此时可以发现addr为地址的数据已经成功插入到了当前索引中

此时再根据addr字段索引数据

GET dynamicfalse/_search
{
  "query": {
    "match": {
      "addr": "地址"
    }
  }
}

返回结果如下:
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

结论: 非动态模式下变更mapping是无法在mapping中生成的,新增的数据虽然可以存储,但是无法被新增的字段索引,只能根据文档索引或者已存在mapping中的字段索引所带出

3.严格模式

新建一个索引(dynamicfalse)并设置dynamic为strict

PUT dynamicstrict
{
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      }
    }
  }
}

查询当前索引(dynamicstrict)的mapping信息

GET dynamicstrict/_mapping

{
  "dynamicstrict" : {
    "mappings" : {
      "dynamic" : "strict",
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

新增一条数据

POST dynamicstrict/_doc
{
  "name": "张三",
  "age": 15
}

3.1严格模式下索引文档

GET dynamicstrict/_search

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "dynamicstrict",
        "_type" : "_doc",
        "_id" : "-1bS54wBAEWV3dbH3I99",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}

结论: 严格模式下索引文档是可以的

3.2严格模式下索引字段

GET dynamicstrict/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

返回结果如下:
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "dynamicstrict",
        "_type" : "_doc",
        "_id" : "-1bS54wBAEWV3dbH3I99",
        "_score" : 0.5753642,
        "_source" : {
          "name" : "张三",
          "age" : 15
        }
      }
    ]
  }
}

结论:严格模式下索引mapping中存在的字段也是可以的

3.3严格模式下变更Mapping

POST dynamicstrict/_doc
{
  "addr": "地址"
}

返回报错信息如下:
{
  "error" : {
    "root_cause" : [
      {
        "type" : "strict_dynamic_mapping_exception",
        "reason" : "mapping set to strict, dynamic introduction of [addr] within [_doc] is not allowed"
      }
    ],
    "type" : "strict_dynamic_mapping_exception",
    "reason" : "mapping set to strict, dynamic introduction of [addr] within [_doc] is not allowed"
  },
  "status" : 400
}

结论: 严格模式下无法新增字段,此模式可以用于在工作中防止自己的索引字段被人修改文章来源地址https://www.toymoban.com/news/detail-812490.html

到了这里,关于【ElasticSearch-基础篇】Mapping结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 分布式搜索引擎ElasticSearch——基础

    什么是elasticsearch elasticsearch的发展 https://lucene.apache.org/ https://www.elastic.co/cn/ 正向索引和倒排索引 安装elasticsearch,kibana https://github.com/medcl/elasticsearch-analysis-ik 部署单点es 创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: 加载镜像

    2024年01月17日
    浏览(42)
  • 分布式搜索引擎Elasticsearch基础入门学习

    Elasticsearh 是 elastic.co 公司开发的分布式搜索引擎。 Elasticsearch(简称ES)是一个开源的分布式、高度可扩展的全文搜索和分析引擎。它能够快速、近乎实时的存储、搜索和分析大量数据。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型数据。 它通

    2024年02月03日
    浏览(37)
  • 微服务---分布式搜索引擎 elasticsearch基础

    1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的车 1.1.2.ELK技术栈 elasticsearch结合kibana、Logstash、Beats,

    2024年02月04日
    浏览(44)
  • es elasticsearch 八 mapping 映射 、复杂数据类型

    目录 Mapping 映射 复杂数据类型 Mapping 映射 精确匹配 必须和对应字段值安全一致才可查出 全文检索 缩写搜索全程、格式转换 大小写 同义词 全文检索核心原理 分词,初步的倒排索引的建立 重建倒排索引 时态转换、重复数的转换、同义词的转换、大小写的转换 分词器 analy

    2024年02月07日
    浏览(57)
  • 微服务一实用篇:分布式搜索引擎(ElasticSearch)基础解析

    学习分布式搜索引擎(ElasticSearch)的基础知识,包括初识ElasticSearch、倒排索引、ES的一些概念、安装和分词器等。

    2024年02月16日
    浏览(45)
  • 【ElasticSearch】索引数据mapping嵌套深度过大导致Stackoverflow问题排查

    集群所有数据节点频繁因为StackOverflowError的错误挂掉,启动后还会挂掉,StackOverflowError异常栈如下 通过堆栈可以看出是写入线程池[write]发生的Stackoverflow,并且可能是在解析mapping的过程发生的,通过ObjectMapper类推断是Object类型数据写入导致的。因此通过拉取集群内所有索引的

    2024年02月03日
    浏览(40)
  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(47)
  • ElasticSearch搜索引擎:数据的写入流程

    (1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node  (2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上 shard = hash(document_id) %

    2023年04月14日
    浏览(63)
  • 【Elasticsearch学习笔记二】es的Mapping字段映射、Mapping字段常用类型、Mapping映射的创建、查看和更新、es数据迁移、ik分词器

    目录 1、Mapping字段映射概述 2、Mapping字段常用类型 3、映射中对时间类型详解 1)采取自动映射器来映射 2)手工映射提前指定日期类型 4、ES的keyword的属性ignore_above 5、Mapping映射的查看和创建 1)查看mapping信息:GET 索引名/_mapping 2)创建映射:PUT /索引名 3) 查看所有索引映

    2024年01月20日
    浏览(60)
  • 搜索引擎(大数据检索)论述[elasticsearch原理相关]

    首先需要大致知道搜索引擎有大致几类:1.全文搜索引擎 2.垂直搜索引擎 3.类目搜索引擎等。 1.全文搜索引擎:是全文本覆盖的,百度,google等都是全文本搜索,就是我搜一个词项“方圆”,那么这个词项可以是数字平方的概念,可以是一个人名,可以是一首歌等,所有的相

    2023年04月08日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包