- Published on
Elasticsearch 基础
- Authors
- Name
- Shelton Ma
Elasticsearch(ES)是一个分布式搜索引擎,它以**文档(JSON)的形式存储数据,使用 倒排索引(Inverted Index) 进行高效查询,同时支持分片(Shard)和副本(Replica)**以实现高可用性和扩展性.
1. 数据存储方式
1. ES 的数据结构
ES 采用 索引(Index)
- 文档(Document)
- 字段(Field)
结构
- 索引(Index): 类似数据库中的 "表"(但更灵活).
- 文档(Document):类似 "行"(存储 JSON 数据).
- 字段(Field):类似 "列"(每个 JSON 键值对).
- 分片(Shard):索引可以分成多个分片,每个分片可以独立存储和搜索.
- 副本(Replica):用于容灾,保证数据安全性.
2. 数据写入流程
当你向 ES 插入数据 时,ES 内部会经过以下几个步骤
1. 数据写入流程
接收请求 ES 通过
REST API
接收PUT /index/_doc/id
请求.路由分片(Shard Routing) ES 计算该文档属于哪个主分片(Primary Shard).计算方式:
shard = hash(id) % num_of_shards
.写入主分片(Primary Shard) 数据会先写入主分片,并保存在**事务日志(Translog)**中,防止宕机数据丢失.
主分片数据写入倒排索引(Inverted Index).
同步到副本分片(Replica Shard) 主分片写入成功后,ES 将数据同步到副本分片,保证高可用性.
返回成功响应 如果所有分片写入成功,ES 返回 201 Created.
2. 创建数据
curl -X POST "http://localhost:9200/users/_doc/1" -H "Content-Type: application/json" -d '{
"name": "张三",
"age": 30,
"city": "北京"
}'
# 返回
{
"_index": "users",
"_id": "1",
"result": "created"
}
3. 索引创建
索引相当于数据库中的 "表",但 ES 索引可以配置 字段类型、分片 和 副本策略.
创建索引
curl -X PUT "http://localhost:9200/users" -H "Content-Type: application/json" -d '{ "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" }, "city": { "type": "keyword" } } } }'
查询索引
curl -X GET "http://localhost:9200/users"
删除索引
curl -X DELETE "http://localhost:9200/users"
4. 查询数据(倒排索引)
Elasticsearch 使用 倒排索引(Inverted Index)
来加速搜索
- 文本字段(text):使用
分词(Tokenization)
,例如张三
会被分词为["张", "三"]
. - 精确匹配(keyword):不会分词,例如
"city": "北京"
只能匹配"北京"
.
精确匹配查询
curl -X GET "http://localhost:9200/users/_search" -H "Content-Type: application/json" -d '{ "query": { "match": { "name": "张三" } } }'
过滤查询
curl -X GET "http://localhost:9200/users/_search" -H "Content-Type: application/json" -d '{ "query": { "bool": { "must": [ { "match": { "city": "北京" } } ], "filter": [ { "range": { "age": { "gte": 20, "lte": 40 } } } ] } } }'
5. 历史数据归档
在大规模数据场景下,历史数据 不适合长期存放在 ES,可以采用冷热存储、分索引存储、自动删除策略等方式.
索引生命周期管理(ILM), 可以设置 数据冷热分离,如:
- 热存储(Hot):最新数据,查询最频繁
- 温存储(Warm):查询较少,压缩存储
- 冷存储(Cold):几乎不查询,但需要保存
- 删除(Delete):彻底删除
# 示例:设置 30 天后转入冷存储,60 天后删除 curl -X PUT "<http://localhost:9200/_ilm/policy/my_policy>" -H "Content-Type: application/json" -d '{ "policy": { "phases": { "hot": { "actions": { } }, "cold": { "min_age": "30d", "actions": { "allocate": { "include": { "data": "cold" } } } }, "delete": { "min_age": "60d", "actions": { "delete": {} } } } } }'
按时间创建索引, 每天自动创建索引,如 logs-2025-03-28
curl -X PUT "<http://localhost:9200/logs-2025-03-28>"
自动删除旧数据
curl -X DELETE "<http://localhost:9200/logs-2024->*"