搜索数据库入门:Elasticsearch 与 OpenSearch
本教程系统讲解搜索数据库核心概念,以 Elasticsearch 与 OpenSearch 为代表,涵盖倒排索引、集群与索引/分片/副本数据模型、REST API 全文搜索、分词与 BM25 相关性排序、聚合分析、两者对比及 Python 接入方法,帮助建立搜索数据库全景认知。
视频讲解
搜索数据库入门:Elasticsearch 与 OpenSearch
一个视频,讲透搜索数据库,不用学几个月。
第一章 - 搜索数据库是什么
这一个视频把搜索数据库这一类讲完,重点对比两个代表:{{Elasticsearch}} 和 {{OpenSearch}}。
一句话:搜索数据库是为{{全文检索和相关性排序}}而生的——用户搜一句话,它找到最相关的文档,而不是做事务。
和关系型数据库的分工
关系型:强事务、精确查询 -> 存核心业务数据
搜索库:全文检索、相关性排序 -> 做搜索、日志分析
这一类数据库的共同点
- 底层都是{{倒排索引}},按词找文档。
- 存 JSON 文档,REST API 访问。
- 天生分布式,分片 + 副本。
本章小结
搜索数据库不是为下单而生,而是为"搜一句话,找到最相关的"而生。Elasticsearch 是龙头,OpenSearch 是其开源分支。
第二章 - 倒排索引:全文检索的核心
正排 vs 倒排
正排是"文档里有哪些词",倒排反过来"词出现在哪些文档里",这才是搜索快的秘密。
文档1: "Ada likes SQL"
文档2: "Ada likes Redis"
倒排索引:
Ada -> [文档1, 文档2]
likes -> [文档1, 文档2]
SQL -> [文档1]
Redis -> [文档2]
搜 "SQL" 不用扫所有文档,直接查倒排表就知道在文档1。
为什么快
倒排索引把"找内容"变成"查词典",命中即返回,还天然支持相关性打分。
本章小结
倒排索引是搜索数据库的发动机:词 -> 文档列表,一步定位。
第三章 - 数据模型:索引、分片、副本
三层结构
Cluster(集群)
└─ Index(索引,一个业务的数据集合,类似库/表)
├─ Shard(分片,数据切片,可水平扩展)
└─ Replica(副本,高可用)
文档是 JSON
{
"name": "Ada",
"age": 28,
"bio": "Ada likes SQL and Redis"
}
分片与副本
一个索引拆成多个主分片(扩展),每个主分片有若干副本(容灾)。
索引 users
├─ 主分片0 -> 副本0
├─ 主分片1 -> 副本1
└─ 主分片2 -> 副本2
本章小结
集群 -> 索引 -> 分片/副本,文档是 JSON,分片管扩展、副本管容灾。
第四章 - Elasticsearch:索引与全文搜索
写入与搜索(REST API)
# 写一条文档
curl -X PUT "localhost:9200/users/_doc/1" \
-H 'Content-Type: application/json' \
-d '{"name":"Ada","bio":"Ada likes SQL"}'
# 全文搜索
curl -X POST "localhost:9200/users/_search" \
-H 'Content-Type: application/json' \
-d '{"query":{"match":{"bio":"SQL"}}}'
查询种类
{"query": {"match": {"bio": "SQL Redis"}}} // 全文匹配
{"query": {"term": {"age": 28}}} // 精确匹配
{"query": {"bool": {"must": [...], "filter": [...]}}} // 组合
本章小结
Elasticsearch 用 REST + JSON 交互,match 做全文、term 做精确、bool 做组合。
第五章 - Elasticsearch:分词、相关性、聚合
分词 Analyzer
搜索前先{{分词}}:把文本切成词、转小写、去停用词,再建倒排索引。
"Ada likes SQL" -> 分词 -> [ada, likes, sql]
分词决定能不能搜到,中文分词(如 ik 分词器)尤其重要。
相关性打分
结果按{{相关性}}排序,默认用 {{BM25}} 算法:词出现频率高、又稀有的,得分更高。
聚合 Aggregations
聚合像 SQL 的 GROUP BY,实时算统计:
{"aggs": {"by_city": {"terms": {"field": "city"}}}}
本章小结
分词决定搜不搜得到,BM25 决定谁排前面,聚合负责实时统计——搜索库三件套。
第六章 - OpenSearch:兼容 Elasticsearch 的搜索库
是什么
{{OpenSearch}} 是从 Elasticsearch 7.10 分叉出来的开源搜索库,由 AWS 主导。接口、查询语法、客户端几乎完全兼容。
几乎一样的使用方式
curl -X PUT "localhost:9200/users/_doc/1" \
-H 'Content-Type: application/json' \
-d '{"name":"Ada","bio":"Ada likes SQL"}'
curl -X POST "localhost:9200/users/_search" \
-H 'Content-Type: application/json' \
-d '{"query":{"match":{"bio":"SQL"}}}'
连地址端口、请求格式都一样,只是背后引擎换了。
配套工具
- {{OpenSearch Dashboards}}:对应 Kibana 的可视化界面。
- {{Amazon OpenSearch Service}}:AWS 托管版,免运维。
本章小结
OpenSearch 是 Elasticsearch 的"兄弟",接口兼容,适合想要开源 + 云托管的人。
第七章 - Elasticsearch vs OpenSearch 对比
| 维度 | Elasticsearch | OpenSearch |
|---|---|---|
| 起源 | 原生 | 从 ES 7.10 分叉 |
| 许可 | 部分闭源 | 完全开源 |
| API | 标准 | 兼容 |
| 托管 | Elastic Cloud | Amazon OpenSearch |
| 适合 | 生态最大、教程最多 | 要纯开源或 AWS 托管 |
一句话选型
要最大生态和官方支持选 {{Elasticsearch}},要纯开源或 AWS 托管选 {{OpenSearch}}。
本章小结
两者 API 几乎一样,差别在许可和托管——按"要不要纯开源 / 用不用 AWS"来选。
第八章 - 用 Python 连接两者
Elasticsearch:elasticsearch 客户端
from elasticsearch import Elasticsearch
es = Elasticsearch("http://localhost:9200")
es.index(index="users", id=1, document={"name": "Ada", "bio": "Ada likes SQL"})
res = es.search(index="users", query={"match": {"bio": "SQL"}})
print(res["hits"]["hits"])
OpenSearch:opensearch-py 客户端
from opensearchpy import OpenSearch
os = OpenSearch("http://localhost:9200")
os.index(index="users", id=1, body={"name": "Ada", "bio": "Ada likes SQL"})
res = os.search(index="users", body={"query": {"match": {"bio": "SQL"}}})
本章小结
elasticsearch 和 opensearch-py 两个客户端接口几乎一样,换库只换 import。
第九章 - 什么时候用搜索数据库
适合
- 全文搜索、相关性排序(商品、文章、文档搜索)。
- 日志分析(ELK:Elasticsearch + Logstash + Kibana)。
- 实时聚合统计。
不适合
- 强事务的核心业务数据 -> 关系型。
- 需要 JOIN 的复杂关联 -> 关系型。
- 频繁单行更新 -> 更适合关系型或键值。
本章小结
搜索数据库赢在"搜得准、搜得快",输在"事务和频繁更新"。
总结
- 核心回顾:搜索数据库靠倒排索引做全文检索;集群 -> 索引 -> 分片/副本;REST + JSON 交互,match 全文、term 精确、bool 组合;分词决定召回,BM25 决定排序,聚合做实时统计;Elasticsearch 生态最大,OpenSearch 纯开源 + AWS 托管,两者 API 几乎一致。
- 学习路线:先 Docker 起 Elasticsearch -> 练索引、match 搜索、聚合 -> 再起 OpenSearch 对比 -> 各写一个 Python 搜索脚本。
- 推荐练习:① 导入一批商品文档,用 match 做全文搜索;② 配一个中文分词器,对比分词前后搜索结果;③ 用聚合按类别统计商品数量。
实践示例
导入一批商品文档,用 match 做全文搜索
配置一个中文分词器,对比分词前后搜索结果
用聚合按类别统计商品数量
用 Python 分别连接 Elasticsearch 和 OpenSearch 完成搜索
后续与前置知识
- 数据库导论:12 分钟看懂整个数据库世界上下位
面向零基础学习者的数据库导论教程,12分钟建立数据库世界地图,覆盖为何需要数据库、OLTP vs OLAP、9类数据库系统(关系型、键值、文档、宽列、图、搜索、时序、OLAP、向量)、SQL vs NoSQL、共同框架(Schema、数据类型、CRUD、持久化、索引)、对象存储与数据库的区别,以及程序如何通过 Driver、Connection Pool、ORM 连接数据库。
- Docker 演示教程:一次打包,到处运行前置
面向初学者的 Docker 实操教程,10 分钟演示镜像与容器概念、Dockerfile 构建、Docker Compose 多服务编排、常用排错命令,并通过 Node.js + nginx + PostgreSQL 博客项目实战完成容器化部署。
- Python 基础教程 · 10 分钟上手实操课前置
面向零基础初学者的 Python 实操教程,10 分钟从安装运行开始,讲解变量与数据结构、函数与模块、文件 I/O 与异常处理,最后实战完成 CSV 数据分析小工具。
- 命令行演示教程:10 分钟从图形界面走向键盘自由前置
面向零基础初学者的命令行实操教程,10 分钟从打开终端开始,讲解 Shell、Terminal、PATH 核心概念,演示文件系统操作、管道重定向与文本处理,并编写 Shell 脚本完成日志分析报告生成器。
- SQL 入门:从一张表看懂数据库相关
本文从一张表入手,系统讲解 SQL 数据库核心概念与操作,涵盖建库查数据、列记录主键、约束索引、DDL/DML/DQL/DCL/TCL 五类 SQL 语言、SELECT 聚合分组排序、JOIN 多表拼接、五大范式与反范式、事务与 ACID、视图索引权限、SQLite/PostgreSQL/MySQL 对比、Python 连接数据库、ORM 映射以及 DBeaver 图形化管理,适合快速建立 SQL 全景。
- 文档数据库入门:MongoDB 与 Couchbase相关
本教程系统讲解文档数据库核心概念,以 MongoDB 和 Couchbase 为代表,涵盖数据模型、CRUD 操作、查询与聚合、索引、副本集、分片、事务、多模型能力、选型对比及 Python 接入方法,帮助建立文档数据库全景认知。
- 键值数据库入门:Redis 与 DynamoDB相关
本教程系统讲解键值数据库核心概念,以 Redis 和 DynamoDB 为代表,对比内存与云托管两种形态,涵盖 Redis 五种数据结构、过期持久化高可用、经典场景,DynamoDB 数据模型、主键设计、CRUD、二级索引、容量一致性、单表设计,并通过 Python 示例连接两者,最后给出选型建议与练习。
引用此知识点
- 图数据库入门:Neo4j相关
本文系统讲解图数据库核心概念,以 Neo4j 为代表,涵盖节点、边、路径的数据模型,Cypher 图查询语言,多跳遍历与最短路径,社交网络、知识图谱、风控、推荐等典型场景,对比关系型数据库的 JOIN 查询,并演示使用 Python 驱动连接 Neo4j。
- 时序数据库入门:InfluxDB 与 TimescaleDB相关
本文系统讲解时序数据库核心概念,以 InfluxDB 和 TimescaleDB 为代表,涵盖数据模型、Line Protocol 与 Flux/InfluxQL 查询、保留策略与降采样、超表与连续聚合/压缩、两者对比及 Python 接入方法,帮助建立时序数据库全景认知。
- 向量数据库入门:Qdrant、Milvus、Pinecone相关
本教程系统讲解向量数据库核心概念,以 Qdrant、Milvus、Pinecone 为代表,涵盖 Embedding 向量生成、余弦相似度搜索、ANN 近似最近邻索引(HNSW/IVF)、三者选型对比及 Python 连接方法,帮助快速建立向量数据库全景认知。
- 宽列数据库入门:Cassandra 与 ScyllaDB相关
本教程系统讲解宽列数据库核心概念,以 Cassandra 和 ScyllaDB 为代表,涵盖数据模型(分区键+列族)、CQL 与 CRUD、无主架构与可调一致性、LSM 树与建模、ScyllaDB 的 Shard-per-core 架构、两者对比、Python 连接及适用场景,帮助快速建立宽列数据库全景认知。