引言:ElasticSearch 的定位与应用
ElasticSearch 是一个分布式搜索和分析引擎。想象它是一个超大的图书馆:
- 可以快速找到任何书籍(搜索能力)
- 可以统计各类书籍的数量(分析能力)
- 可以随时添加新书架(可扩展性)
- 即使某个书架损坏,其他书架的书仍然可读(高可用性)
主要应用场景:
- 网站搜索
- 日志分析
- 指标监控
- 业务数据分析
一、基础概念
1.1 索引(Index)
什么是索引?
把索引理解为一个数据库:
- 传统数据库:Database → Table → Row → Column
- ElasticSearch:Index → Type* → Document → Field
(*注:Type 概念在新版本已弃用)
json
// 创建索引
PUT /books
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "keyword" },
"publish_date": { "type": "date" }
}
}
}
索引命名规范:
- 只能小写字母
- 不能包含 , /, *, ?, ", <, >, |,
- 不能以 -, _, + 开头
- 不能是 . 或 ...
1.2 文档(Document)
文档是索引中的一条记录,类似数据库中的一行数据。
json
// 添加文档
PUT /books/_doc/1
{
"title": "ElasticSearch 入门指南",
"author": "张三",
"publish_date": "2024-01-01"
}
文档特点:
- 使用 JSON 格式
- 每个文档都有唯一的 _id
- 文档字段可以动态添加
1.3 字段类型(Field Types)
常见数据类型:
json
{
"mappings": {
"properties": {
"text_field": { "type": "text" }, // 全文搜索
"keyword_field": { "type": "keyword" }, // 精确值
"date_field": { "type": "date" }, // 日期
"long_field": { "type": "long" }, // 长整型
"double_field": { "type": "double" }, // 浮点型
"boolean_field": { "type": "boolean" }, // 布尔值
"object_field": { "type": "object" } // 对象
}
}
}
二、集群相关概念
2.1 节点(Node)与集群(Cluster)
想象一个图书馆系统:
- 集群 = 整个图书馆系统
- 节点 = 单个图书馆分馆
节点类型:
yaml
# elasticsearch.yml 配置示例
node:
name: node-1
# 节点角色配置
master: true # 管理员
data: true # 图书管理员
ingest: false # 图书分类员
2.2 分片(Shard)与副本(Replica)
类比图书管理:
- 分片 = 将书籍分散存放在不同书架
- 副本 = 重要书籍的备份
json
// 设置分片和副本数
PUT /books
{
"settings": {
"number_of_shards": 3, // 分成3个书架
"number_of_replicas": 1 // 每个书架备份一份
}
}
三、搜索相关概念
3.1 查询与过滤
两种查询上下文:
- Query Context:相关性评分(找最相关的书)
- Filter Context:是否匹配(找特定年份的书)
json
// 查询示例
GET /books/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "elasticsearch" }} // Query Context
],
"filter": [
{ "term": { "author": "张三" }}, // Filter Context
{ "range": { "publish_date": { "gte": "2024-01-01" }}}
]
}
}
}
3.2 分词和分析
分析器的组成:
- 字符过滤器:清理特殊字符
- 分词器:分割单词
- Token 过滤器:转换单词(如:大小写转换)
json
// 分析器示例
PUT /books
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "stop"]
}
}
}
}
}
四、基本操作示例
4.1 CRUD 操作
json
// 创建文档
POST /books/_doc
{
"title": "ElasticSearch 实战",
"author": "李四",
"publish_date": "2024-02-01"
}
// 读取文档
GET /books/_doc/1
// 更新文档
POST /books/_update/1
{
"doc": {
"title": "ElasticSearch 实战(第二版)"
}
}
// 删除文档
DELETE /books/_doc/1
4.2 简单查询
json
// 全文搜索
GET /books/_search
{
"query": {
"match": {
"title": "elasticsearch 入门"
}
}
}
// 精确查询
GET /books/_search
{
"query": {
"term": {
"author": "张三"
}
}
}
4.3 常用运维命令
bash
# 查看集群健康状态
GET /_cluster/health
# 查看索引信息
GET /_cat/indices?v
# 查看节点信息
GET /_cat/nodes?v
五、常见误区和注意事项
-
分片数设置误区
- ❌ 分片越多越好
- ✅ 根据数据量合理设置,建议单个分片 20-50GB
-
字段类型选择
- ❌ 所有文本都用 text 类型
- ✅ 精确值匹配用 keyword 类型
-
映射设置
- ❌ 依赖动态映射
- ✅ 生产环境明确定义映射
六、概念关系图
Cluster Node 1 Node 2 Index 1 Index 2 Primary Shard Replica Shard Document 1 Document 2
七、进阶学习建议
-
深入学习路径:
- 掌握基本 CRUD 操作
- 学习复杂查询和聚合
- 理解分布式原理
- 性能优化和运维
-
推荐资源:
- 官方文档
- ElasticStack 视频教程
- 《ElasticSearch 实战》
- Stack Overflow ES 标签
总结
ElasticSearch 的核心概念构成了一个层次分明的体系:
- 集群由节点组成
- 节点存储索引
- 索引包含文档
- 文档包含字段
理解这些基本概念是掌握 ElasticSearch 的基础。随着实践的深入,你会逐渐理解这些概念之间的关联和应用。