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类型。
这两个字段同时使用,则两个条件都符合,才做转化!如果同时符合多个模板,位置约靠前的,越优先使用。
好了,这部分到此基础部分结束,上面有一个隐藏的技术点:index_patterns,索引模板,后续深入了解的时候,再展开讲解。
下面介绍下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