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

image

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

image

当然在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
    }
  }
}
posted @ 2024-01-22 18:51  自学Java笔记本  阅读(73)  评论(0)    收藏  举报