一、索引的基本概念
- 索引(Index):数据的逻辑空间,每个索引包含类型一致的文档。
- 文档(Document):实际存储的数据单元,JSON 格式。
- 映射(Mapping):相当于表结构,定义字段类型及属性。
- 分片(Shards)、副本(Replicas):分布式存储与高可用基础。
二、创建索引
1. 基本创建
最简单的方式,自动推断字段格式:
PUT /my_index
2. 指定 Mapping 创建索引
指定字段类型和属性,利于后续检索和聚合优化:
PUT /my_index
{
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "keyword" },
"publish_date":{ "type": "date" },
"tags": { "type": "keyword" },
"price": { "type": "float" }
}
}
}
常见字段类型:
text:用于全文检索
keyword:用于结构化数据(精确匹配、聚合、排序)
date:日期型字段
integer/float 等:数值型
3. 设置分片与副本数
分片与副本决定数据分布和容错能力:
PUT /my_index
{
"settings": {
"number_of_shards": 3, # 主分片数量
"number_of_replicas": 1 # 每个主分片的副本数量
},
"mappings": { ... } # 可按需加入 mapping
}
建议:分片数量一旦设定不可更改,初始化时根据数据量和硬件资源合理规划。
4. 动态模板和字段忽略设置
动态模板帮助处理未知字段,忽略无用字段避免资源浪费。
PUT /my_index
{
"mappings": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": { "type": "keyword" }
}
}
],
"properties": {
"unnecessary_field": { "enabled": false }
}
}
}
三、索引优化建议
1. 字段类型合理选择
- 用
keyword 存储结构化、分组、过滤/排序字段
- 用
text 存储需要分词或全文检索字段
- 数值、时间类型按需定义,便于聚合与排序
2. 关闭 source 减少存储
如仅做检索可禁用 _source 节省空间(限制再查原始文档):
PUT /my_index
{
"mappings": {
"_source": { "enabled": false },
...
}
}
3. 控制索引刷新与副本策略
插入批量数据时可临时关闭刷新(提高写入性能),写完再恢复:
PUT /my_index/_settings
{
"index": {
"refresh_interval": "-1"
}
}
# 数据写完后恢复自动刷新
PUT /my_index/_settings
{
"index": {
"refresh_interval": "1s"
}
}
副本数低写入快,生产环境建议写完后增加副本。
4. 合理设置分片数量
- 小数据量用 1 个主分片,避免资源浪费
- 大量数据/并发时增大分片并分散到多节点
- 可参考官方推荐的单分片数据量(10~50GB)
5. 字段映射静态化
提前明确 mapping,防止因自动 mapping 产生意外类型和性能问题。
四、索引模板和生命周期管理(ILM)
对大量相似索引(如日志分天建索引)应使用索引模板和生命周期管理自动化:
索引模板:
PUT /_index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": { ... },
"mappings": { ... }
}
}
索引生命周期管理(ILM):
自动冷热数据分层、过期删除、合并等,详见官方文档。
五、常见问题与参考资料
通过合理的索引设计和优化,可以显著提升 Elasticsearch 系统的稳定性和检索效率。如需更深入场景分析,请结合业务实际和官方资源进行规划。