第一阶段 01.Elasticsearch 核心概念与 PostgreSQL 对照

01 · Elasticsearch 核心概念与 PostgreSQL 对照

阶段:第一阶段 / 核心概念

目标:用 PostgreSQL 的心智模型快速建立 Elasticsearch 的世界观。


1. 概念

Elasticsearch(下称 ES)是一个分布式搜索与分析引擎 ,底层是 Lucene 的倒排索引。

它不是关系型数据库,但很多概念可以和 PostgreSQL 一一对应,帮你快速上手。

术语对照表

Elasticsearch PostgreSQL 说明
Index(索引) Table(表) 一类文档的集合,如 orders_idx
Document(文档) Row(行) 一条 JSON 记录
Field(字段) Column(列) JSON 里的 key
Mapping(映射) Table Schema / DDL 定义字段类型
_id 主键 文档唯一标识
Shard(分片) 表分区(近似) 索引水平切分,分布到多节点
Replica(副本) 流复制/备库(近似) 分片的冗余拷贝,用于高可用与读扩展
倒排索引 B-Tree / GIN 索引 ES 默认所有字段都建索引
Node / Cluster 实例 / 集群 多节点组成集群

关键差异:在 PostgreSQL 里「先建表,数据默认没索引,需要时才 CREATE INDEX」;

在 ES 里「几乎所有字段默认就是可检索的」,因为它的定位就是搜索。


2. PostgreSQL 对照

一张销售数据表在 PG 里是这样的:

sql 复制代码
CREATE TABLE salesdata_master_info (
    record_id      bigint PRIMARY KEY,
    invoice_number varchar(64),
    material       varchar(64),
    net_amount     numeric(18,2),
    invoice_dt     date
);

INSERT INTO salesdata_master_info
VALUES (1001, 'INV-2026-001', 'ThinkPad-X1', 8999.00, '2026-07-01');

在 ES 里,同样一条数据是一个 JSON 文档:

json 复制代码
{
  "record_id": 1001,
  "invoice_number": "INV-2026-001",
  "material": "ThinkPad-X1",
  "net_amount": 8999.00,
  "invoice_dt": "2026-07-01"
}
  • PG 的「表结构」= ES 的 mapping
  • PG 的「一行」= ES 的 一个 document
  • PG 的「主键」= ES 的 _id

3. ES DSL(在 Kibana Dev Tools 里跑)

查看集群健康(相当于「数据库还活着吗」):

复制代码
GET _cluster/health

查看索引列表(相当于 \dt 列出所有表):

复制代码
GET _cat/indices?v

查看某个索引的 mapping(相当于查看表结构 \d salesdata_master_info):

复制代码
GET salesdata_idx/_mapping

查一条文档(相当于 SELECT * FROM t WHERE id = 1001):

复制代码
GET salesdata_idx/_doc/1001

查全部(相当于 SELECT * FROM t LIMIT 10):

复制代码
GET salesdata_idx/_search
{
  "query": { "match_all": {} },
  "size": 10
}

4. Spring Boot 实现

通过 ElasticsearchClient(官方 co.elastic.clients 客户端)访问 ES,

把它声明为 Spring Bean(见第 04 篇),直接注入即可。

java 复制代码
@Slf4j
@Component
public class ClusterInfoDemo {

    @Autowired
    private ElasticsearchClient elasticsearchClient;

    /** 相当于 SELECT * FROM salesdata_idx WHERE _id = ? */
    public Map<String, Object> getById(String indexName, String id) throws IOException {
        GetResponse<Map> resp = elasticsearchClient.get(
                g -> g.index(indexName).id(id), Map.class);
        return resp.found() ? resp.source() : null;
    }

    /** 相当于 SELECT * FROM salesdata_idx LIMIT 10 */
    public List<Map> matchAll(String indexName) throws IOException {
        SearchResponse<Map> resp = elasticsearchClient.search(s -> s
                .index(indexName)
                .query(q -> q.matchAll(m -> m))
                .size(10), Map.class);
        return resp.hits().hits().stream()
                .map(Hit::source)
                .collect(Collectors.toList());
    }
}

生产落地:用 SearchRequest.of(req -> ...) 构建请求,Query.of(q -> q.matchAll(...))

兜底空条件(完整骨架见第 42 篇)。


5. 坑与最佳实践

  1. ES 不是事务型数据库 :没有 PG 那样的 ACID 多行事务,别拿它当主库写业务。
    典型模式是:数据先落 PostgreSQL,再同步写入 ES 供查询(批量 bulk 写,见 31/42 篇)。
  2. 近实时(NRT) :写入后默认 1s 才可被搜索到(refresh_interval),不是立即可见。
  3. 分片数创建后不可改:类似 PG 分区策略要提前规划。副本数可以动态调整。
  4. 不要把 ES 当唯一数据源:它是查询/分析加速层,权威数据仍在 PG。

下一篇

02-Mapping与数据类型.md:重点讲 text vs keyword------这是从 SQL 转 ES 最容易踩的坑。

相关推荐
喵个咪10 小时前
GoWind Admin 拆解:BI 大屏设计器——schema 即 JSON、resolver 注入与三张快照表的口径谱系
大数据·后端·go
武子康11 小时前
H3-World 的 11.3 小时训练数据,是怎样对齐成动作监督的?
大数据·人工智能·深度学习
字节跳动数据平台12 小时前
火山引擎知识引擎VeKnow进化之路(下):让 AI 智能体更可用、更可信、更懂业务
大数据
Elastic 中国社区官方博客12 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
MyBili13 小时前
Chrome隐私安全配置:完整防护指南
大数据·chrome·谷歌浏览器·隐私安全·浏览器防护·cookie管理·上网痕迹清理
真上帝的左手13 小时前
19. 大数据-数据同步-工具
大数据·数据同步
数字孪生视频孪生13 小时前
在线重构,实时同步:视频动态三维重建打造 “常更常新” 的数字底座
大数据·人工智能·重构·架构·空间计算
Aloudata13 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Elasticsearch14 小时前
Kibana 中的人工智能连接器:你的 agent 可调用的 90 多个数据源
elasticsearch
云上工程笔记14 小时前
SRT字幕一键转手绘动画:srt-whiteboard-animation的复刻实录
大数据·开发语言·javascript·人工智能·机器学习