Elasticsearch 实战教程
你是否曾为 SQL LIKE 查询的缓慢而头疼?是否需要快速分析海量非结构化数据?Elasticsearch 正是解决这些问题的利器——它是基于 Apache Lucene 构建的分布式 RESTful 搜索与分析引擎,适用于全文检索、日志分析、实时数据洞察等场景。
1. 快速上手:安装与启动
我们使用 Docker 进行部署,这是本地开发环境最快的启动方式,无需处理系统依赖。
1.1 Docker 单节点部署
首先拉取官方稳定版镜像(本文使用 8.12.0):
然后运行容器(注意:本地开发禁用了安全功能,生产环境必须开启):
等待 30 秒左右,检查是否启动成功:
看到包含 cluster_name、version 的 JSON 响应即说明成功。
1.2 Docker Compose 部署
为了方便后续管理,使用 docker-compose.yml 文件:
启动命令:
2. 核心概念扫盲
用relational-database做类比,快速理解 Elasticsearch 的核心概念:
Type 概念在 Elasticsearch 7.x 后已废弃,无需关注。
3. 索引管理:定义数据结构
索引是文档的容器,创建索引前需要先定义 Mapping(类似数据库的表结构)。
3.1 创建博客文章索引
我们创建一个用于存储博客文章的索引,包含常用字段:
text:用于全文检索,会被分词器拆分为词条;keyword:用于精确匹配、排序、聚合,不会分词;date/integer:时间、数值类型,用于范围查询和聚合。 :::
检查索引是否创建成功:
4. 文档操作:CRUD 基础
现在我们在 blog_posts 索引中进行文档的增删改查操作。
4.1 新增文档
可以指定 ID,也可以让 Elasticsearch 自动生成:
4.2 查询文档
根据 ID 获取单个文档:
4.3 更新文档
部分更新文档(无需重写整个文档):
4.4 删除文档
根据 ID 删除文档:
5. 搜索 DSL:核心功能
Elasticsearch 的 Query DSL 是其最强大的功能,使用 JSON 构建复杂的搜索请求。
5.1 基础搜索
1. 搜索所有文档
2. 全文搜索(match)
在 content 字段中搜索包含 "elasticsearch" 的文档:
3. 多字段搜索(multi_match)
在 title、content、tags 三个字段中搜索,其中 title 权重最高(^3):
4. 精确匹配(term)
查找作者为 "张三" 的文档(必须使用 keyword 字段):
5.2 布尔查询(bool)
结合多个条件,使用 must(AND)、filter(过滤,不影响评分)、should(OR):
:::tip 优先使用 filter
Filter 上下文不会计算相关性评分,且结果会被缓存,性能远高于 must。
5.3 结果排序
按发布时间倒序,再按相关性评分倒序:
6. Python 集成:实战开发
使用官方 elasticsearch Python 客户端与集群交互。
6.1 安装客户端
6.2 基础连接与操作
首先连接到本地集群:
然后编写几个常用的辅助函数:
6.3 测试代码
添加一篇文章并执行搜索:
7. 快速优化与最佳实践
这里列出几个新手必知的优化建议:
- 批量索引:使用
bulkAPI 一次添加多个文档,减少网络开销; - 限制返回字段:使用
_source只获取需要的字段; - 使用索引别名:通过别名访问索引,避免重索引时的 downtime;
- 避免过度分片:小索引用 1-3 个分片即可;
- 监控集群状态:使用
GET /_cluster/health检查状态(green=正常,yellow=无副本,red=异常)。
总结
本文涵盖了 Elasticsearch 的核心内容:快速安装、核心概念、索引与文档管理、Query DSL 搜索以及 Python 集成。掌握这些内容后,你已经可以为项目添加基础的搜索功能了。
后续我们会继续更新聚合分析、集群部署、安全配置等进阶内容,敬请关注!

