ES7基础篇-04-索引映射操作(_mappering)

文章目录

  • 1.`简介`
  • 2. 索引库和索引映射一起创建
  • 3. 索引库和索引映射分开创建
  • 4. 字段映射解释
  • 5.`查看映射关系`
  • 6.`映射属性详解`

1.简介

有了索引库,等于有了数据库中的database
接下来就需要索引库中的类型了,也就是数据库中的
但是在es7中,映射类型已经被移除,但是映射约束还在,
创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做字段映射(mapping)

映射是定义文档的过程,文档包含哪些字段,字段是否store, 是否index, 是什么类型的数据, 是否分词等信息;

2. 索引库和索引映射一起创建

eg:

PUT /wql
{
  "mappings": {
    "properties": {
      "address": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "userName": {
        "type": "keyword"
      },
      "userPhone": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

当然也可以同时设置settings 和 aliases,我就采用系统默认了
ES7基础篇-04-索引映射操作(_mappering)_第1张图片

3. 索引库和索引映射分开创建

分两步执行,先创建索引库,再创建字段映射
eg:

PUT /wql

PUT /wql/_mapping
{
  "properties": {
    "address": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "userName": {
      "type": "keyword"
    },
    "userPhone": {
      "type": "text",
      "analyzer": "ik_max_word"
    }
  }
}

4. 字段映射解释

PUT /索引库名/_mapping
{
  "properties": {
    "字段名1": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    },
    "字段名2": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    },
    ...
  }
}

字段名:任意填写,下面指定许多属性,例如:

  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:分词器,这里的ik_max_word即使用ik分词器

使用PUT方法,后面跟随我们的索引名称,再接上_mapping,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword,index索引为false,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。

我们在更新字段时候,是不能修改字段的类型的。如果我们要修改字段的类型,最好是新建一个新的字段,指定正确的类型,然后再更新索引,以后我们只需要查询这个新增的字段就可以了。

注意:

  • es7 开始类型名称已经被弃用
    ES7基础篇-04-索引映射操作(_mappering)_第2张图片
    官网链接: https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
    两种场景:
    • 同一个index下,不同的type,命名名称一样的字段名。
    • 同一个数据库下,不同的表,命名名称一样的字段名。

在关系型数据库中,不同的表中,包含相同的字段名是很常见的,而且它们可以做到互不干扰。

在ElasticSearch中,不同的type,如果包含相同的字段名,它们是一样的,es会认为是一个字段,模糊掉不同type的概念。

所以在es里边,type这个概念没必要存在,所以es7就废弃了

在同一个index中,不同的type,创建一个同名的字段,但是类型不要弄成一样的,看能否成功创建。

答案是不可以,它会提示你,不可以将这个字段的类型更改为这个类型。所以,结论就是,es确实把不同type中的同名字段,当成了一个字段。在设计索引库的时候,同名问题一定要注意,最简单的方法就是一个index,一个type,想要其他类型,另外创建index,当然你可以用别的字段名。

注意:ES7废弃,但还在用,ES8才真正的去掉了type。
ES7基础篇-04-索引映射操作(_mappering)_第3张图片
比如这样玩,在7以下可以,7之后不行,会报错;

  • es7之后版本需要在索引库后面拼接一个参数
    include_type_name参数,值为true
    ES7基础篇-04-索引映射操作(_mappering)_第4张图片
PUT /wql/_mapping/wang-01?include_type_name=true
{
  "properties": {
    "id": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "userName": {
      "type": "text",
      "index": "false"
    },
    "userPhone": {
      "type": "keyword",
      "index": "false"
    }
  }
}

响应结果:

#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-minimal-setup.html to enable security.
#! [types removal] Using include_type_name in put mapping requests is deprecated. The parameter will be removed in the next major version.
{
  "acknowledged" : true
}

上述案例中,就给wql这个索引库添加了一个名为wang-01的类型,并且在类型中设置了3个字段:

  • id:id
  • userName:用户名
  • userPhone:用户电话

并且给这些字段设置了一些属性,至于这些属性对应的含义,我们在后续会详细介绍。

5.查看映射关系

语法: GET /索引库名/_mapping

查看某个索引库中的所有类型的映射。如果要查看某个类型映射,可以再路径后面跟上类型名称。即:

  • es7之前可以这样查询:
GET /索引库名/_mapping/映射名
  • es7之后这样查询:
GET /索引库名/_mapping/

GET /索引库名/_mapping/?pretty

示例: GET /索引库名/_mapping/

响应:

{
  "wql" : {
    "mappings" : {
      "properties" : {
        "id" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        },
        "userName" : {
          "type" : "text",
          "index" : false
        },
        "userPhone" : {
          "type" : "keyword",
          "index" : false
        }
      }
    }
  }
}

6.映射属性详解

  • type(数据类型)
    Elasticsearch中支持的数据类型非常丰富:
    ES7基础篇-04-索引映射操作(_mappering)_第5张图片
    我们说几个关键的:

    • String类型,又分两种:

      • text可分词,不可参与聚合
      • keyword不可分词,数据会作为完整字段进行匹配,可以参与聚合
    • Numerical:数值类型,分两类

      • 基本数据类型:long,interger,short,byte,double,float,half_float
      • 浮点数的高精度类型:scaled_float
      • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
    • Date:日期类型

    elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

    • Array:数组类型
    • 进行匹配时,任意一个元素满足,都认为满足
    • 排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序
    • Object:对象
{
    name:"Jack",
    age:21,
   	girl:{
		name: "Rose",
        age:21
   }
}

如果存储到索引库的是对象类型,例如上面的girl,会把girl处理成两个字段:girl.name和girl.age

  • index :index影响字段的索引情况。

    • true:字段会被索引,则可以用来进行搜索过滤,默认值就是true
    • false:字段不会被索引,不能用来搜索
      index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
      但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。
  • store :是否将数据进行额外存储。
    在学习lucene和solr时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。
    但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。
    原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示。
    而如果设置store为true,就会在_source以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。

ES7基础篇-04-索引映射操作(_mappering)_第6张图片

小tip:

Elasticsearch之settings和mappings的意义:
简单的说,就是

  • settings是修改分片和副本数的。
  • mappings是修改字段和类型的。
    ES的mapping如何用?什么时候需要手动,什么时候需要自动?
  • Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping
  • 我们在es中添加索引数据时不需要指定数据类型,es中有自动影射机制,字符串映射为string,数字映射为long。通过mappings可以指定数据类型是否存储等属性。
PUT /wql
{
  "mappings": {
    "properties": {
      "userName": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "userPhone": {
        "type": "text"
      },
      "address": {
        "type": "text"
      }
    }
  }
}

你可能感兴趣的:(ES-基础篇,elasticsearch)