Elasticsearch映射
大约 3 分钟ElasticsearchElasticsearch
字段映射
映射是定义文档及其包含的字段如何存储和索引的过程。映射分为动态映射和显示映射。
动态映射
动态字段映射
当Elasticsearch在文档中检测到一个新字段时,默认情况下它会动态地将该字段添加到类型映射中。动态映射规则如下:
注
- "dynamic true"是指在索引文档时,Elasticsearch会自动检测索引字段的类型,并根据字段值的类型来推断字段的映射类型。例如,如果字段的值是一个字符串,那么该字段的映射类型就会被推断为"string"。这种自动推断字段类型的功能可以简化索引文档的过程,但也可能导致字段类型的不一致。
- "runtime"是Elasticsearch 7.0版本中引入的一个新功能,它允许用户在查询时动态地定义和使用脚本字段。脚本字段是在查询期间计算出来的虚拟字段,它可以根据文档的字段值来进行计算和转换。通过使用脚本字段,用户可以在不修改索引映射的情况下,对文档进行动态的计算和转换操作。
基本使用:
## 创建索引 PUT /dynamic_field_index { "mappings": { "dynamic":true } } ## 插入测试数据 POST /dynamic_field_index/_doc/1 { "name":"xw", "age":"10" } ##查看索引mappling结构如下 { "dynamic_field_index" : { "mappings" : { "dynamic" : "true", "properties" : { "age" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } } }
开启string类型自动识别为数字和日期:
## 修改索引映射结构,开启string类型自动识别数字和时间格式 PUT /dynamic_field_index/_mapping { "numeric_detection": true, "dynamic_date_formats": [ "yyyy/MM||MM/dd/yyyy"] } ## 添加测试数据 POST /dynamic_field_index/_doc/4 { "name":"xw", "age":"102", "int1":"2", "float2":"2.0", "date1":"2044/05" }
查看索引mappling如下图所示,字符串
date1
自动识别为日期类型,float2
自动识别为float类型:
动态模板
Elasticsearch动态模板是一种配置机制,它允许你定义一组规则,以便在索引文档时自动应用映射和设置。动态模板可以根据字段名、字段类型或其他条件来匹配字段,并为匹配的字段应用指定的映射和设置。
基本使用:
PUT _index_template/my_dynamic_template
{
## 索引正则
"index_patterns": ["*"],
"template": {
"mappings": {
"dynamic_templates": [
{
"my_fields": {
"match_mapping_type": "string",
"match": "my_*",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
}
显示映射
显示映射指定字段,示例如下:
PUT /my-index-000001
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
运行时字段
运行时字段(Runtime Fields)是一种临时创建的字段,它们在查询过程中动态计算或提取,而不会存储在索引中。这些字段在查询时可以根据需要创建,并且对于临时的计算、聚合或转换非常有用。示例如下:
## 添加索引
PUT /my-index-runtime
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
}
},
"runtime": {
"my_runtime_field": {
"type": "keyword",
"script": {
"source": "emit(doc['name'].value.toUpperCase())"
}
}
}
}
}
## 添加测试数据
POST /my-index-runtime/_doc/1
{
"name":"aaagfGFDGFD"
}
查询:
GET /my-index-runtime/_search
{
"query": {
"match": {
"my_runtime_field": "AAAGFGFDGFD"
}
}
, "fields": [
"my_runtime_field"
]
}
##结果如下
{
"took" : 9,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my-index-runtime",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "aaagfGFDGFD"
},
"fields" : {
"my_runtime_field" : [
"AAAGFGFDGFD"
]
}
}
]
}
}
在查询的时候也可以指定运行时字段,示例如下:
GET /my-index-runtime/_search
{
"runtime_mappings": {
"search_runtime_field": {
"type": "keyword",
"script": {
"source": "emit(doc['name'].value.toLowerCase())"}
}
},
"fields": [
"search_runtime_field"
]
}
数据类型
请参考官方文档,不再赘述。