ES从0到1——Mapping介绍

文章介绍了Elasticsearch(ES)中的Mapping概念,它是类似于MySQL表结构的定义,包括元数据、字段类型、分区和副本设置。动态映射允许ES根据插入的数据自动识别字段类型,但可以通过dynamic字段进行控制,如true、false和strict模式。此外,文章提到了动态模板(dynamic_templates)用于精细控制字段映射。还详细列出了ES中的各种数据类型,如string、keyword、text、数值类型和时间类型等。

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

 

1.Mapping是什么?

mapping是映射,对比MySQL而言,他相当于MySQL的表结构定义。

包括:设置元数据、定义存储字段的类型、分区、副本等设置

稍后我们逐一介绍下mapping的具体结构都是指什么。

先来两个例子:

{
  "order": 1,
  "index_patterns": [
    "task-unit*"
  ],
  "settings": {
    "index.max_result_window": 10000000,
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "string2keyword": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        },
        {
          "string2long": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "long"
            }
          }
        },
  			{
          "match2string": {
            "match": "*string",
            "mapping": {
              "type": "string"
            }
          }
        }
      
      ],
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "category": {
          "type": "integer"
        },
        "metric": {
          "type": "object"
        },
        "taskInstanceId": {
          "type": "long"
        },
        "taskId": {
          "type": "keyword"
        },
        "inspectionItemId": {
          "type": "long"
        },
        "type": {
          "type": "integer"
        }
    
      }
    }
  }
}

ES真实存储的一条记录

{
  "_index" : "risk-task-20221223",
  "_type" : "_doc",
  "_id" : "yABJP4UBiGUELNHVfn70",
  "_version" : 1,
  "_seq_no" : 1872,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "riskName" : "",
    "calculateRuleId" : 16,
    "fetchDataRuleCategory" : 6,
    "inspectionItemId" : 48,
    "taskTriggerTag" : "手动执行",
    "errorCode" : 5002,
    "inspectionValue" : 0.0,
    "taskTemplateId" : 33,
    "taskCalculateType" : 0,
    "algoParams" : {
      "currentEndTime" : 1671087600000,
      "currentStartTime" : 1671087000000,
      "latestPeriodRequired" : true,
      "minPeriodDataRaito" : 0.6,
      "periodLength" : 30,
      "k" : 3,
      "weightForPeriod" : [
        {
          "weight" : 0.1,
          "order" : 0
        }
      ]
    },
    "metricInstantiateRuleType" : "ap",
    "taskId" : 146
  }
}

那我们接着展开说说具体的知识点

动态映射

类比MySQL来说明:

我们创建数据库时,需要通过create语句来指定字段名称,字段类型等,预先设置好表结构,然后再往里面插入数据存储,而在ES中,也可以不指定这些设置,直接把数据添加到ES中存储,ES会动态的根据填入的文档字段自动识别其类型。

也就是说

我们可以直接向ES中添加一个内容,可以不提前设置他的字段类型等映射

也可以再一个指定好的ES映射中,添加另外一个之前不存在的类型字段

ES与传统的关系型数据库相比,这点是个明显的差异。

在ES中,主要是通过:dynamic字段来控制的。

true:允许动态添加

false:忽略新添加的不存在的字段

strict:遇到新字段,抛出异常

注意,这个字段很灵活,可以再任意一层做设置,可以自定义设置在哪个对象里动态

PUT /my_index
{
    "mappings": {
        "_doc": {
            "dynamic":      "strict", 
            "properties": {
                "name":  { "type": "string"},
                "address":  {
                    "type":     "object",
                    "dynamic":  true 
                }
            }
        }
    }
}

这里说明:在_doc这整个类型里,不允许添加新的字段。但是在内部对象address中可以动态创建新的字段

注意:

当动态添加一个字段的时候,ES会根据第一次插入的新字段的类型去自动识别绑定此新字段的类型,如果后面,再插入这个字段的其他类型的数据,则会报错。(因为前后类型不一致)----由于这个问题,ES提供了动态模板——《dynamic_templates》,这可以让我们完全控制生成字段的映射。

举例示例,见文章上方的第一个示例。

解释:

sting2long中,使用:match_mapping_type来转化类型,这个意思是说,当遇到string类型的新映射,可以使用这个模板,被映射成long存储到ES中。(手动转化一下类型,去适配存储)

match2string中,使用match来转化新字段名称符合*string结尾的字段,将此字段转化成string类型。

这两个字段同时使用,则两个条件都符合,才做转化!如果同时符合多个模板,位置约靠前的,越优先使用。

2 mapping结构解释

好了,这部分到此基础部分结束,上面有一个隐藏的技术点:index_patterns,索引模板,后续深入了解的时候,再展开讲解。

3 字段类型

下面介绍下ES中,都可以存储哪些数据类型

类型

备注

字符串

string、keyword/text

ELasticsearch 5.X 之后的字段类型不再支持 string,由 text 或 keyword 取代。

text

当一个字段要被全文搜索,比如商品描述,则应该使用此字段

因为此字段内容会被分析器分成一个个词项。

text类型不用于排序,很少用于聚合

keyword

当前Field不会被分词

数值类型

long

取值范围为-9223372036854774808~922337203685477480(-2的63次方到2的63次方-1),占用8个字节

integer

取值范围为-2147483648~2147483647(-2的31次方到2的31次方-1),占用4个字节

short

取值范围为-32768~32767(-2的15次方到2的15次方-1),占用2个字节

byte

取值范围为-128~127(-2的7次方到2的7次方-1),占用1个字节

double

1.797693e+308~ 4.9000000e-324 (e+308表示是乘以10的308次方,e-324表示乘以10的负324次方)占用8个字节

float

3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,e-45表示乘以10的负45次方),占用4个字节

half_float

精度比float小一半。

scaled_float

根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45

时间类型

date

针对时间类型指定具体的格式

布尔类型

boolean

二进制类型

binary

类型暂时支持Base64 encode string

范围类型

long_range

赋值时,无需指定具体的内容,只需要存储一个范围即可,指定gt,lt,gte,lte

integer_range

double_range

float_range

date_range

ip_range

经纬度类型

geo_point

用来存储经纬度的

ip类型

ip

可以存储IPV4或者IPV6

参考文章:

Elasticsearch学习-ES中动态映射有什么用_es mapping 显示映射的优点_wind_huise的博客-CSDN博客

https://www.cnblogs.com/forever226/p/16504085.html

 其他的数据类型参考官网:Field datatypes | Elasticsearch Guide [6.5] | Elastic

### ElasticsearchMapping 的详细介绍 #### 映射的概念及其重要性 MappingElasticsearch 文档结构的定义,类似于关系型数据库中的表模式。它指定了每个字段的数据类型以及如何处理这些数据。这不仅影响到数据存储的方式,也决定了查询性能功能特性[^1]。 #### 创建索引并定义映射 当创建一个新的索引时,可以通过提供 `mappings` 参数来设定初始映射配置: ```json PUT /my-index-000001 { "settings": { "number_of_shards": 1, "analysis": { ... } }, "mappings": { "_source": {"enabled": true}, "properties": { "title": { "type": "text" }, "date": { "type": "date", "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"}, "comments": { "type": "nested" } } } } ``` 此示例展示了基本映射设置,其中包含了文本(`text`)类型的 title 字段、日期(`date`)类型的 date 字段 嵌套对象(nested object) comments[] 数组[^4]。 #### 自动检测与动态模板 如果未显式声明映射,则会启用自动检测机制,默认情况下会对新引入的未知字段应用合理的猜测策略;然而为了更精确控制新增加字段的行为,建议利用动态模板(Dynamic Templates),允许基于正则表达式的匹配规则自定义特定条件下的映射逻辑[^3]。 #### Analyzer 配置详解 Analyzer 负责解析输入字符串成一系列 token (词条), 这对于全文本搜索至关重要。可以在字段级别上指定不同的 analyzers 来优化不同场景下检索效果: * **Index-time analyzer**: 当文档被索引时使用的分词器。 * **Search-time analyzer**: 查询阶段所采用的分词方案。 例如,在下面的例子中设置了两个独立的分析链路——一个是用来建立倒排索引(indexing),另一个则是服务于实际查询(search time): ```json PUT my_index { "mappings": { "properties": { "content": { "type": "text", "analyzer": "ik_max_word", // Index-time analyzer "search_analyzer": "ik_smart" // Search-time analyzer } } } } ``` 这里采用了中文分词插件 IK Analyzer 提供的不同粒度级别的切分方式作为例子[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值