面试题答案
一键面试优化索引映射通过设置动态映射相关参数
- 动态映射参数说明
dynamic
:控制动态映射是否开启。取值有true
(默认,新字段自动添加到映射)、false
(新字段被忽略)、strict
(新字段会抛出异常)。dynamic_date_formats
:用于指定日期字段的格式。如果不指定,Elasticsearch 会尝试自动检测日期格式,但指定后能更精确控制。
- 设置动态映射参数优化索引映射
- 关闭动态映射:如果事先知道所有字段,可将
dynamic
设置为false
,防止意外字段被添加到映射中。例如:
- 关闭动态映射:如果事先知道所有字段,可将
{
"mappings": {
"dynamic": false,
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
}
}
}
}
- 严格模式:当希望确保所有字段都预先定义时,使用
strict
。例如,在一个财务数据索引中,只允许特定的字段进入索引,任何新字段都视为错误。
{
"mappings": {
"dynamic": "strict",
"properties": {
"amount": {
"type": "double"
},
"transaction_date": {
"type": "date"
}
}
}
}
- 指定日期格式:在处理日期字段时,指定
dynamic_date_formats
。比如日志数据中日期格式为yyyy - MM - dd HH:mm:ss
,可这样设置:
{
"mappings": {
"dynamic_date_formats": ["yyyy - MM - dd HH:mm:ss"],
"properties": {
"log_time": {
"type": "date"
}
}
}
}
实际业务场景中动态映射问题及解决办法
- 问题:在一个电商商品索引中,动态映射可能会因为商品属性的多样性导致问题。例如,部分商品有一个自定义属性
color
,其值为字符串"red"
,而另一部分商品有color
属性,但其值为数组["red", "blue"]
。动态映射可能会将该字段映射为text
类型,但后续如果想要对颜色进行聚合查询,这种映射就无法满足需求。 - 解决办法:事先定义好
color
字段的映射,将其定义为keyword
类型,以支持聚合操作。
{
"mappings": {
"properties": {
"color": {
"type": "keyword"
}
}
}
}
这样无论color
属性是单个值还是数组,都能正确索引和查询,提高查询性能。