Elasticsearch 映射Mappings (三)

文章目录


前言

本文主要记录映射Mappings的作用、类型、ES常用数据类型、常见参数、重要的数据类型、映射配置、映射模板。

静态参数使不可修改的,所以mappings里的配置需要谨慎行事


一、Mapping简介

mapping类似Mysql中的表结构,在Maping里包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一份字段可以有多个类型。

查看索引映射

所有(默认创建keyword映射)

java 复制代码
GET <索引名>/_mapping
java 复制代码
{
  "text_create": {
    "mappings": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

查看指定

java 复制代码
GET <索引名>/_mapping/field/<字段名称>
java 复制代码
{
  "text_create": {
    "mappings": {
      "name": {
        "full_name": "name",
        "mapping": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

二、自动映射 dynamic mapping

在索引文档写入时发生自动创建mapping的机制。在写入文档时会自动为该文档创建mapping映射字段。在创建索引时不要求创建mapping映射,ES会根据字段值来推断字段类型,进而创建并指定索引类型。

自动类型推断

自动类型推断的规则为:

field type dynamic runtime
true/false boolean boolean
小数 float double
数字 long long
object object -
数组 取决于数组中的第一个非空元素类型 取决于数组中的第一个非空元素类型
日期格式字符串 date date
数字类型字符串 float/long double/long
其它字符串 text + keyword keyword

自动映射器会尽可能的把字段映射为宽字段类型

java 复制代码
PUT text_create/_doc/1
{
  "price": 18.12,
  "display": true,
  "object":{
    "1":1,
    "2":2
  },
  "arey" :[
    "3","4"
    ],
    "time": "2011-11-12"
}

mapping对应映射

java 复制代码
{
  "text_create": {
    "mappings": {
      "properties": {
        "age": {
          "type": "long"
        },
        "arey": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "display": {
          "type": "boolean"
        },
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "object": {
          "properties": {
            "1": {
              "type": "long"
            },
            "2": {
              "type": "long"
            }
          }
        },
        "price": {
          "type": "float"
        },
        "time": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

mapping注意点

  • ES 没有隐式转换
  • ES 不支持类型修改
  • 生产环境尽可能避免使用 dynamic mapping

三、手动映射 Expllicit mapping

也称为显示映射,在索引文档写入前。创建索引并且指定索引中每个字段类型、分词器等参数。

mapping索引创建完成后,部分mapping的属性时不允许更改的

创建索引

java 复制代码
PUT text_mapping
{
  "mappings": {
    "properties": {
      "text_field" : {
        "type": "text",
        "fields": {
          "text_filed_keyword":{
          "type": "keyword"
        }
          
        }
      },
      "long_field": {
        "type": "long"
      }
    }
  }
}

四、自动映射模板 Dynamic Templates

在定义字段映射的时候,往往字段不一定有具体的名称,有时候希望对一类相同或者相似特征的字段定义相同的映射,此时可以使用Dynamic Templates。

定义映射模板

java 复制代码
"dynamic_templates": [
  {
    "my_template_name": {
      ... match conditions ...
      "mapping":{...}
    }
  },
  ...
]

规则判定:conditlons

match_mapping_type

用于匹配数据类型

例子

java 复制代码
PUT templates_text
{
  "mappings": {
    "dynamic_templates": [
      {
        "integers":{
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "integers":{
          "match_mapping_type":"string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
      ]
  }
}

插入数据,对应的字段将会自动带上对应的类型。

java 复制代码
PUT templates_text/_doc/1
{
  "my_integer": 500,
  "my_string": "smz"
}
java 复制代码
      "properties": {
        "my_integer": {
          "type": "integer"
        },
        "my_string": {
          "type": "keyword"
        }
      }

match、unmatch

用以匹配字段名称规则,支持通配符、正则表达式。

正则:

java 复制代码
 "match_pattern": "regex",
 "match": "^profit_\d+$"

示例:

java 复制代码
PUT templates_text2
{
  "mappings": {
    "dynamic_templates": [
      {
        "longs_as_strings":{
          "match_mapping_type": "string",
          "match": "num_*", #以num_*开头
          "unmatch": "*_text",#不以_text结尾
          "mapping": {
            "type": "long"
          }
        }
      }
      ]
  }
}

path_match、path_unmatch

用于嵌套字段

用例:

java 复制代码
PUT templates_text3
{
  "mappings": {
    "dynamic_templates": [
      {
        "full_name":{
          "path_match": "name.*", #路径
          "path_unmatch": "*.middle",#路径不匹配
          "mapping": {
            "type": "text",
            "copy_to": "full_name"#符合的字段拷贝到此
          }
        }
      }
      ]
  }
}

分词器变量

java 复制代码
PUT templates_text4
{
  "mappings": {
    "dynamic_templates": [
      {
        "named_analyzers":{
          "match_mapping_type": "string",
          "match": "*", 
          "mapping": {
            "type": "text",
            "analyzer": "{name}" #分词器名称
          }
        }
      },
      {
        "no_doc_values":{
          "match_mapping_type": "*",
          "mapping": {
            "type": "{dynamic_type}",
            "doc_values": "false"
          }
        }
      }
      ]
  }
}

以上示例,定义的两个模板,有以下规则:

  • 所有字符串类型的字段,其分词器都会定义为和字段名称一致的分词器
  • 所有非文本类型的字段,都会关闭doc_values

总结

本文主要记录了ES映射以及映射配置、映射模板。

相关推荐
xixixi777773 分钟前
基于零信任架构的通信
大数据·人工智能·架构·零信任·通信·个人隐私
Hello.Reader44 分钟前
Flink 自适应批执行(Adaptive Batch Execution)让 Batch 作业“边跑边优化”
大数据·flink·batch
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-01-31
大数据·人工智能·经验分享·搜索引擎·产品运营
babe小鑫2 小时前
中专学历进入快消大厂终端销售岗位的可行性分析
大数据
samFuB2 小时前
【工具变量】区县5A级旅游景区DID数据集(2000-2025年)
大数据
2601_949543012 小时前
Flutter for OpenHarmony垃圾分类指南App实战:主题配置实现
android·flutter
百夜﹍悠ゼ2 小时前
数据治理DataHub安装部署
大数据·数据治理
wdfk_prog3 小时前
解决 `git cherry-pick` 引入大量新文件的问题
大数据·git·elasticsearch
2601_949833393 小时前
flutter_for_openharmony口腔护理app实战+知识实现
android·javascript·flutter
晚霞的不甘3 小时前
Flutter for OpenHarmony从基础到专业:深度解析新版番茄钟的倒计时优化
android·flutter·ui·正则表达式·前端框架·鸿蒙