Elasticsearch-Mapping篇
官方文档
官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
映射是定义文档及其包含的字段如何存储和索引的过程。
每个文档都是字段的集合,每个字段都有自己的 数据类型。映射数据时,您创建一个映射定义,其中包含与文档相关的字段列表。映射定义还包括元数据字段(如 _source字段),它自定义文档关联元数据的处理方式。
使用动态映射和显式映射来定义数据。根据您在数据旅程中所处的阶段,每种方法都会提供不同的好处。例如,显式映射您不想使用默认值的字段,或者更好地控制创建哪些字段。然后,您可以允许 Elasticsearch 动态添加其他字段。
动态映射
动态映射允许您在刚开始时尝试和探索数据。Elasticsearch 只需对文档建立索引即可自动添加新字段。您可以将字段添加到顶级映射以及内部object 和nested字段。
使用动态模板定义自定义映射,这些映射将根据匹配条件应用于动态添加的字段。
动态字段映射
Elasticsearch 数据类型:
| JSON 数据类型 | "dynamic":"true" | "dynamic":"runtime" |
|---|---|---|
| null | 未添加字段 | 未添加字段 |
| true或者false | boolean | boolean |
| double | float | double |
| long | long | long |
| object | object | 未添加字段 |
| array | 取决于null数组中的第一个非值 | 取决于null数组中的第一个非值 |
| string通过日期检测 | date | date |
| string通过数字检测 | float或者long | double或者long |
| string未通过date检测或numeric检测 | text有一个.keyword子字段 | keyword |
可以在文档和级别禁用动态映射 object。将参数设置dynamic为 false忽略新字段,或设置为strict在 Elasticsearch 遇到未知字段时拒绝文档。
dynamic: false:当您在索引文档时将该参数设置为false时,Elasticsearch会忽略新字段的动态映射。这意味着新字段不会被自动检测和创建映射,只有已经存在的字段才会被索引。
PUT data/_mapping
{
"mappings": {
"dynamic": false, // 禁用动态映射
"properties": {
"MyDate": { "type": "date" },// 那么字段MyDate将会是date类型
"MyNumber": { "type": "string" }
}
}
}
日期检测
如果date_detection启用(默认),则检查新字符串字段以查看其内容是否与 中指定的任何日期模式匹配 dynamic_date_formats。如果找到匹配项,date则会添加具有相应格式的新字段。
默认值为 dynamic_date_formats:
[ "strict_date_optional_time", "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
例如现在随意添加一个字段,改字段为差不多的时间格式,当es不能匹配时,会自动转为其他类型格式,而如果格式能够匹配到内置的日期检测,将会转换为日期格式:
// 测试1:普通格式
POST data/_doc/3
{
"MyDate":"2023-10-22 22:20:30"
}
GET data/_mapping

// 测试2:符合时间格式的字段
POST data/_doc/3
{
"create_date":"2022/02/22" // yyyy/MM/dd
}
GET data/_mapping

当然在ES中也可以更换日期规则
参考官网
dynamic_date_formats 字段自定义
案例:
PUT my-index-000001
{ "mappings" : { "dynamic_date_formats" : [ "MM/dd/yyyy" ] } }
动态模板
动态模板允许您更好地控制 Elasticsearch 如何映射您的数据,超越默认的动态字段映射规则。true您可以通过将动态参数设置为或 来启用动态映射runtime。然后,您可以使用动态模板来定义自定义映射,这些映射可以根据匹配条件应用于动态添加的字段:
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html
-
match_mapping_type 对 Elasticsearch 检测到的数据类型进行操作
-
match 并使用 unmatch 模式与字段名称匹配
-
path_match 并在 path_unmatch 通往现场的完整虚线路径上进行操作
如果动态模板未定义 match_mapping_type 、 match 或 path_match ,则它将不匹配任何字段。您仍然可以在批量请求的部分中 dynamic_templates 按名称引用模板。
以下是添加注释的 PUT 请求示例,演示如何使用动态模板将所有以 "ip" 开头的字符串字段映射为 IP 类型:
json
Copy code
# 创建索引 my-index-000001 并定义动态模板
PUT my-index-000001/
{
"mappings": {
"dynamic_templates": [
{
# 自定义模板名称,这里为 "strings_as_ip"
"strings_as_ip": {
# 匹配字段的类型为 "string"
"match_mapping_type": "string",
# 匹配字段名以 "ip" 开头的字段
"match": "ip*",
# 运行时定义,将匹配字段映射为 IP 类型
"runtime": {
"type": "ip"
}
}
}
]
}
}
显式映射
可以在创建索引并将字段添加到现有索引时创建字段映射。
PUT /my-index-000001
{
"mappings": {
"properties": {
"age": { "type": "integer" }, # 创建 age ,字段 integer
"email": { "type": "keyword" }, # 创建 email ,字段 keyword
"name": { "type": "text" } # 创建 name ,字段 text
}
}
}
以下示例添加 employee-id ,一个 keyword index 映射参数值为 false 的字段。这意味着 employee-id 字段的值已存储,但未编制索引或不可用于搜索。
PUT /my-index-000001/_mapping
{
"properties": {
"employee-id": {
"type": "keyword", #精确匹配
"index": false
}
}
}

浙公网安备 33010602011771号