文章目录
-
-
- 一、Settings:索引的集群与功能配置
-
- [1. 核心配置项](#1. 核心配置项)
- [2. 配置示例](#2. 配置示例)
- 二、Mappings:索引的数据结构定义
-
- [1. 核心概念](#1. 核心概念)
- [2. 核心配置项](#2. 核心配置项)
- [3. 配置示例](#3. 配置示例)
- 三、Aliases:索引的别名(访问入口)
-
- [1. 核心作用](#1. 核心作用)
- [2. 核心操作](#2. 核心操作)
- [3. 使用场景示例](#3. 使用场景示例)
- 四、三者关系与核心总结
-
Elasticsearch(ES)中, settings、 mappings 和 aliases 是索引的三大核心配置,分别控制索引的 集群行为 、 数据结构 和 访问入口 ,三者共同定义了索引的功能和使用方式。
一、Settings:索引的集群与功能配置
settings 用于定义索引的集群级参数 和功能开关,控制索引的分片、副本、分词器、刷新频率等核心行为,分为"静态设置"和"动态设置"两类。
1. 核心配置项
(1)静态设置(索引创建后不可修改)
- 分片与副本 :索引数据的分布式存储规则(核心配置)
number_of_shards:主分片数量(默认1),创建后不可修改,需提前预估数据量(单分片建议50-100GB)。number_of_replicas:每个主分片的副本数量(默认1),控制高可用和查询并发。
- 索引生命周期 :绑定ILM策略(如自动冷热分离、过期删除)
index.lifecycle.name:ILM策略名称(如log_policy)。
(2)动态设置(索引创建后可修改)
- 刷新频率 :控制数据写入后可查询的延迟(近实时性核心)
index.refresh_interval:默认1秒,写入密集场景可设为30秒(-1关闭自动刷新)。
- 字段限制 :防止字段爆炸或过度占用资源
index.mapping.total_fields.limit:最大字段数(默认1000),避免动态映射导致字段泛滥。index.mapping.depth.limit:字段嵌套深度(默认20),防止嵌套过深影响查询性能。
- 缓存与合并 :优化查询和写入性能
indices.queries.cache.size:查询缓存大小(默认10%堆内存)。index.merge.scheduler.max_thread_count:合并线程数(默认CPU核心数的50%)。
2. 配置示例
json
PUT /my_index
{
"settings": {
"number_of_shards": 3, // 静态:3个主分片
"number_of_replicas": 1, // 动态:1个副本(可后续修改)
"index.refresh_interval": "5s", // 动态:5秒刷新一次
"index.mapping.total_fields.limit": 2000, // 动态:最大2000个字段
"analysis": { // 静态:自定义分词器(属于settings子配置)
"analyzer": {
"my_ik_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word"
}
}
}
}
}
// 动态修改副本数(无需重建索引)
PUT /my_index/_settings
{
"index.number_of_replicas": 2
}
二、Mappings:索引的数据结构定义
mappings 类似数据库的"表结构",定义了文档中字段的类型 、分词器 、是否索引 、聚合规则等,决定了ES如何存储和解析数据。
1. 核心概念
- 字段类型(Field Types) :指定字段的数据类型,ES支持多种类型,核心分类:
- 文本类:
text(全文检索,会分词)、keyword(精确匹配,不分词)。 - 数值类:
long、integer、double(支持范围查询和聚合)。 - 日期类:
date(支持时间范围查询,需指定格式)。 - 复杂类型:
object(嵌套对象)、nested(独立嵌套文档)、array(数组,无需显式定义类型)。
- 文本类:
- 动态映射(Dynamic Mapping) :ES默认自动推断字段类型(如数字→
long、文本→text+keyword子字段),生产环境建议关闭(dynamic: false),避免类型错误。 - 元字段(Meta-fields) :ES内置的文档元信息,如
_id(文档唯一ID)、_source(原始文档内容)、_timestamp(时间戳)。
2. 核心配置项
type:字段类型(如text、long)。analyzer:索引时使用的分词器(如ik_max_word)。search_analyzer:搜索时使用的分词器(默认与analyzer一致)。index:是否索引(true可查询,false仅存储,不可查询)。store:是否单独存储(默认false,依赖_source存储,true可单独读取该字段,节省_source传输开销)。format:日期字段的格式(如"yyyy-MM-dd HH:mm:ss")。ignore_above:超过指定长度的字符串不索引(如keyword字段设为256,超过256字符的内容不参与查询)。
3. 配置示例
json
PUT /my_index
{
"mappings": {
"properties": {
"product_name": { // 商品名称:全文检索+精确匹配
"type": "text",
"analyzer": "ik_max_word", // 索引时分词器
"search_analyzer": "ik_smart", // 搜索时分词器(更精准)
"fields": {
"keyword": { // 子字段:用于聚合和精确匹配
"type": "keyword",
"ignore_above": 256
}
}
},
"price": { "type": "double" }, // 价格:数值类型
"stock": { "type": "integer" }, // 库存:整数类型
"create_time": { // 创建时间:日期类型
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" // 支持多格式
},
"tags": { "type": "keyword" }, // 标签:精确匹配(数组类型无需显式定义)
"description": { // 商品描述:仅存储不索引
"type": "text",
"index": false
}
}
}
}
三、Aliases:索引的别名(访问入口)
aliases 是索引的"虚拟名称",类似数据库的"视图",可关联一个或多个索引,用于简化索引访问、实现无缝切换、分组管理等。
1. 核心作用
- 简化访问 :用简短别名替代长索引名(如用
prod替代product_202501)。 - 索引切换 :无感知切换后端索引(如从
prod_v1切换到prod_v2,无需修改业务代码)。 - 索引分组 :将多个相关索引关联到同一别名(如
log_202501、log_202502关联到logs,查询时可一次性查询所有分组索引)。 - 过滤与路由 :给别名绑定过滤条件(如仅查询
status: active的文档)或路由规则(如按用户ID路由到指定分片)。
2. 核心操作
(1)创建索引时绑定别名
json
PUT /product_202501
{
"aliases": {
"prod_current": {}, // 绑定别名prod_current
"prod_2025": {} // 同时绑定到分组别名prod_2025
}
}
(2)给已有索引添加/删除别名
json
// 添加别名:给product_202502添加prod_current和prod_2025别名
POST /_aliases
{
"actions": [
{ "add": { "index": "product_202502", "alias": "prod_current" } },
{ "add": { "index": "product_202502", "alias": "prod_2025" } }
]
}
// 删除别名:从product_202501移除prod_current别名
POST /_aliases
{
"actions": [
{ "remove": { "index": "product_202501", "alias": "prod_current" } }
]
}
(3)查询别名关联的索引
json
GET /_alias/prod_current // 查看prod_current别名关联的索引
GET /product_202501/_alias // 查看product_202501的所有别名
(4)带过滤条件的别名
json
POST /_aliases
{
"actions": [
{
"add": {
"index": "product_202501",
"alias": "prod_active",
"filter": { "term": { "status": "active" } } // 仅查询状态为active的文档
}
}
]
}
3. 使用场景示例
- 业务代码查询时,直接使用别名
prod_current,无需关心后端实际索引名。 - 当需要切换索引(如季度数据归档,新建
product_202502),只需通过_aliases操作切换别名绑定,业务无感知。 - 查询2025年所有商品时,直接查询别名
prod_2025,自动聚合product_202501、product_202502等索引的数据。
四、三者关系与核心总结
| 配置项 | 核心作用 | 可修改性 | 核心关联 |
|---|---|---|---|
settings |
控制索引的集群行为与性能 | 静态配置不可改,动态可改 | 分词器配置需在settings中定义,供mappings使用 |
mappings |
定义数据结构与解析规则 | 字段可新增,类型不可改 | 依赖settings中的分词器,决定数据如何存储和查询 |
aliases |
提供灵活的索引访问入口 | 可随时添加/删除/切换 | 不依赖settings和mappings,仅作为访问代理 |
核心总结:
settings管"集群层面"(分片、性能、功能),mappings管"数据层面"(结构、解析),aliases管"访问层面"(入口、切换)。- 索引创建时需重点规划
settings(静态分片)和mappings(字段类型),aliases可后续灵活调整,是实现索引生命周期管理的关键。