使用 Elasticsearch 构建搜索引擎
很多人对 Elasticsearch 的第一印象是“搜索神器”,但它本质上是一个基于 Apache Lucene 优化的分布式实时文档存储+分析引擎——存储只是基础,检索才是核心优势。今天就来快速上手,用 Python 客户端搭一个基础的中文全文检索系统原型。
1. 先理清核心逻辑:类比关系型数据库
很多新手容易被 ES 的一堆专有名词绕晕,这里先用大家熟悉的 RDBMS 做个简单但够用的对应(注意不是严格等价):
2. 5分钟搭好本地测试环境
不用纠结复杂的集群配置,单节点 Docker 容器是新手入门最快的方式:
2.1 拉取并启动 ES
启动后等30秒左右,访问 http://localhost:9200,如果返回类似 JSON 的集群信息,说明成功了。
2.2 安装 Python 客户端
官方推荐的 elasticsearch-py 7.x+ 支持 ES 7.x/8.x 系列,直接 pip 安装即可:
3. 准备工作:索引定义(Mapping)
ES 默认会根据你插入的第一条文档自动推断字段类型,但中文全文检索场景必须手动指定 Mapping——比如给文本字段加中文分词器,给 URL、状态码这种不需要分词的字段设为 keyword 类型。
这里我们用新闻搜索做场景,先插入 IK 分词器(默认 ES 只有英文分词器,中文会拆成单个汉字):
重启后写 Python 代码创建索引:
4. 核心功能实战
4.1 文档操作
ES 提供了单条和批量操作的接口,生产环境优先用 bulk API 批量插入/更新/删除,性能比单条快几十倍。
单条操作
4.2 搜索功能
搜索是 ES 的灵魂,这里介绍3个最常用的场景。
场景1:简单的全文匹配
比如搜索“2024高考报名”,ES 会返回标题或内容包含相关关键词的文档,并按相关性排序:
场景2:带条件的布尔查询
布尔查询是 ES 最灵活的查询方式,支持 must(必须满足,算分)、must_not(必须不满足,不算分)、should(满足即可加分)、filter(必须满足,不算分但会走缓存,性能最好)。
比如搜索“2023-2024年发布的,分类是‘高考政策’或‘教育’,标题或内容包含‘报名’但不包含‘成人高考’的新闻”:
5. 新手必看的3个最佳实践
- 索引设计要前置规划:Mapping 创建后,除了新增字段,其他类型/分词器的修改都需要重建索引。可以用别名(Alias) 管理索引,重建时只需要切换别名,业务完全无感知。
- 性能优化从细节入手:
- 避免大文档(>100MB),建议拆成多个小文档;
- 批量操作时,bulk 请求的大小控制在 5-15MB;
- filter 查询多的场景,要合理利用 ES 的缓存机制。
- 生产环境必须开启安全配置:前面我们为了测试关闭了 xpack.security,生产环境要启用 HTTPS、用户名密码认证、RBAC 访问控制。
6. 总结与扩展
今天我们快速过了 ES 的核心概念、环境搭建、索引定义、文档操作和常用搜索场景,用 Python 就能轻松搭一个基础的中文全文检索原型。
如果想深入学习,可以看看这些官方/权威资源:

