← 返回知识宇宙
数据库·进阶

搜索数据库入门:Elasticsearch 与 OpenSearch

本教程系统讲解搜索数据库核心概念,以 Elasticsearch 与 OpenSearch 为代表,涵盖倒排索引、集群与索引/分片/副本数据模型、REST API 全文搜索、分词与 BM25 相关性排序、聚合分析、两者对比及 Python 接入方法,帮助建立搜索数据库全景认知。

知识编号35
关系轨道7
学习难度进阶
搜索数据库ElasticsearchOpenSearch倒排索引全文检索数据库Python入门教程
抖音

视频讲解

搜索数据库入门:Elasticsearch 与 OpenSearch

一个视频,讲透搜索数据库,不用学几个月。


第一章 - 搜索数据库是什么

这一个视频把搜索数据库这一类讲完,重点对比两个代表:{{Elasticsearch}} 和 {{OpenSearch}}。

一句话:搜索数据库是为{{全文检索和相关性排序}}而生的——用户搜一句话,它找到最相关的文档,而不是做事务。

和关系型数据库的分工

关系型:强事务、精确查询 -> 存核心业务数据
搜索库:全文检索、相关性排序 -> 做搜索、日志分析

这一类数据库的共同点

本章小结

搜索数据库不是为下单而生,而是为"搜一句话,找到最相关的"而生。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 是 Elasticsearch 的"兄弟",接口兼容,适合想要开源 + 云托管的人。


第七章 - Elasticsearch vs OpenSearch 对比

维度ElasticsearchOpenSearch
起源原生从 ES 7.10 分叉
许可部分闭源完全开源
API标准兼容
托管Elastic CloudAmazon 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。


第九章 - 什么时候用搜索数据库

适合

不适合

本章小结

搜索数据库赢在"搜得准、搜得快",输在"事务和频繁更新"。


总结

实践示例

后续与前置知识

更多数据库知识