Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍

Elasticsearch的Mapping定义了索引结构,类似于数据库的Schema。它包含字段名称、数据类型,如字符串、数字、日期等,并设置字段的分词器和其他配置。动态Mapping能自动识别字段类型,但可能导致错误,需要显式Mapping来精确控制。显式Mapping常用参数如analyzer、index、null_value等。精确值和全文本字段在不同的场景下有不同的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       

目录

 一、什么是 Mapping?

二、Mapping的数据类型

2.1. 核心数据类型

2.1.1、字符串类型

2.1.2、数字类型

2.1.3、日期类型

2.1.4、布尔类型

2.1.5、二进制类型

2.1.5、范围类型

2.2、复杂类型

2.2.1、对象类型(object)

2.2.2 嵌套类型(nested)

2.3. 地理数据类型

2.4. 特殊数据类型

2.5.数组类型

三、Dynamic Mapping (动态Mapping)

3.1、类型自动识别

 3.2、能否更改mapping的字段类型

四、显式Mapping及常见参数

  4.1、映射参数

4.1.1、analyzer 分词器(重点)和 search_analyzer 

4.1.2、index

4.1.3、index_options参数

4.1.4、null_value设置

 4.1.5、copy_to

五、精确值和全文本

六. 小结


 

   Elasticsearch的Mapping,定义了索引的结构,类似于关系型数据库的Schema。Elasticsearch的Setting定义中定义分片和副本数以及搜索的最关键组件,即:Analyzer,也就是分析器。

 一、什么是 Mapping?

 Mapping类似于关系型数据库的Schema,主要包含以下内容:

  1. 定义索引中字段的名称
  2. 定义字段的数据类型,如:字符串、数字、boolean等
  3. 可对字段设置倒排索引的相关配置,如是否需要分词,使用什么分词器

从7.x开始,一个Mapping只属于一个索引的type 默认type 为:_doc

  1. 每个文档属于一个type
  2. 一个type有且仅有一个Mapping定义
  3. 从7.x开始,不需要在Mapping中指定type信息,默认type为   _doc

二、Mapping的数据类型

     ES 字段类型类似于 MySQL 中的字段类型,ES 字段类型主要有:核心类型、复杂类型、地理类型以及特殊类型,具体的数据类型如下图所示:

官网参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping-params.html

2.1. 核心数据类型

  核心数据类型与我们常使用的强类型语言中的数据类型类似,可分为以下几类:

属性名字 说明
text

用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引

keyword 不分词
long 有符号64-bit integer:-2^63 ~ 2^63 - 1
integer 有符号32-bit integer,-2^31 ~ 2^31 - 1
short 有符号16-bit integer,-32768 ~ 32767
byte  有符号8-bit integer,-128 ~ 127
double 64-bit IEEE 754 浮点数
float 32-bit IEEE 754 浮点数
half_float 16-bit IEEE 754 浮点数
boolean true,false
date https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html
binary

该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索

2.1.1、字符串类型

   在 ES 7.x 有两种字符串类型:text 和 keyword,在 ES 5.x 之后 string 类型已经不再支持了。

   text :类型适用于需要被全文检索的字段,例如新闻正文、邮件内容等比较长的文字,text 类型会被 Lucene 分词器(Analyzer)处理为一个个词项,并使用 Lucene 倒排索引存储,text 字段不能被用于排序,如果需要使用该类型的字段只需要在定义映射时指定 JSON 中对应字段的 type 为 text。

   keyword:不会被分词,适合简短、结构化字符串,例如主机名、姓名、商品名称等,可以用于过滤、排序、聚合检索,也可以用于精确查询

2.1.2、数字类型

     数字类型分为 long、integer、short、byte、double、float、half_float、scaled_float

     数字类型的字段在满足需求的前提下应当尽量选择范围较小的数据类型,字段长度越短,搜索效率越高,对于浮点数,可以优先考虑使用 scaled_float 类型,该类型可以通过缩放因子来精确浮点数,例如 12.34 可以转换为 1234 来存储。

2.1.3、日期类型

      在 ES 中日期可以为以下形式:

      格式化的日期字符串,例如 2020-03-17 00:00、2020/03/17时间戳(和 1970-01-01 00:00:00 UTC 的差值),单位毫秒或者秒即使是格式化的日期字符串,ES 底层依然采用的是时间戳的形式存储

{
  "mappings": {
    "_doc": {
      "properties": {
        "create_date": {
          "type": "date", 
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

2.1.4、布尔类型

   JSON 文档中同样存在布尔类型,不过 JSON 字符串类型也可以被 ES 转换为布尔类型存储,前提是字符串的取值为 true 或者 false,布尔类型常用于检索中的过滤条件。

2.1.5、二进制类型

二进制类型 binary 接受 BASE64 编码的字符串,默认 store 属性为 false,并且不可以被搜索。

2.1.5、范围类型

  围类型可以用来表达一个数据的区间,可以分为5种:

  integer_range、float_range、long_range、double_range 以及 date_range。

#创建索引
PUT /range_test
{
  "mappings": {
    "_doc": {
      "properties": {
        "count": {
          "type": "integer_range"
        },
        "create_date": {
          "type": "date_range", 
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

#添加数据
POST /range_test/_doc/1
{
  "count" : { 
    "gte" : 1,
    "lte" : 100
  },
  "create_date" : { 
    "gte" : "2019-02-1 12:00:00", 
    "lte" : "2019-03-30"
  }
}
#检索 其中5 在 1-100之间可以被检索出来
GET /range_test/_doc/_search
{
    "query":{
        "term":{
            "count":5
        }
    }
}

2.2、复杂类型

    复合类型主要有对象类型(object)嵌套类型(nested)

2.2.1、对象类型(object)

      JSON 字符串允许嵌套对象,一个文档可以嵌套多个、多层对象。可以通过对象类型来存储二级文档,不过由于 Lucene 并没有内部对象的概念,ES 会将原 JSON 文档扁平化,例如文档:

PUT my_index/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}
PUT my_index
{
  "mappings": {
    "_doc": { 
      "properties": {
        "region": {
          "type": "keyword"
        },
        "manager": { 
          "properties": {
            "age":  { "type": "integer" },
            "name": { 
              "properties": {
                "first": { "type": "text" },
                "last":  { "type&
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值