在 Elasticsearch 中,**映射(Mapping)**决定了索引中字段的类型、如何被索引和分析,以及如何被搜索和聚合。设计良好的映射对性能、存储和查询效果都非常重要。
下面从 设计原则 → 字段类型选择 → 常见设计模式 → 示例 → 最佳实践 系统讲一下。
"dynamic": "strict" // 或 false
index: false 可节省空间和写入性能flattened 或 object + keyword| 类型 | 用途 | 是否分词 |
|---|---|---|
| text | 全文检索 | ✅ |
| keyword | 精确匹配、聚合 | ❌ |
✅ 常见写法(一个字段两种用途):
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
integer / long / float / double / scaled_float"price": {
"type": "scaled_float",
"scaling_factor": 100
}
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||epoch_millis"
}
"is_deleted": {
"type": "boolean"
}
ES 中字段天然支持数组,无需特殊类型:
"tags": ["es", "search"]
"user": {
"properties": {
"name": { "type": "keyword" },
"age": { "type": "integer" }
}
}
"orders": {
"type": "nested",
"properties": {
"product": { "type": "keyword" },
"count": { "type": "integer" }
}
}
"raw_data": {
"type": "text",
"index": false
}
{
"mappings": {
"dynamic": "false",
"properties": {
"timestamp": { "type": "date" },
"level": { "type": "keyword" },
"message": { "type": "text", "index": false },
"service": { "type": "keyword" }
}
}
}
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"title.keyword": {
"type": "keyword"
},
"price": { "type": "scaled_float", "scaling_factor": 100 },
"category": { "type": "keyword" },
"tags": { "type": "keyword" }
}
}
}
{
"mappings": {
"properties": {
"user_id": { "type": "keyword" },
"event": { "type": "keyword" },
"props": { "type": "flattened" }
}
}
}
✅ 生产环境
dynamic 或设为 strictkeyword 做聚合nested 处理对象数组✅ 性能优化
index: falseenabled: false_source: false✅ Schema 演进
Elasticsearch Mapping 设计的核心是:明确字段用途、减少不必要索引、合理分词、避免动态失控。
如果你有具体业务(如日志 / 搜索 / 时序 / 电商),我可以帮你直接设计一份可用 Mapping。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。