PostgreSQL 全文检索与 JSON 查询入门

站长发布于 2026/08/26更新于 2026/09/171244 次阅读

场景

个人站点的搜索需求(标题、摘要、关键词)用 PostgreSQL 原生能力即可满足,无需引入 ES。

ILIKE:最简单的方式

SELECT * FROM tools
WHERE name ILIKE '%docker%'
   OR summary ILIKE '%docker%';

数据量在十万级以内性能完全够用,配合 pg_trgm 扩展还可以加速。

tsvector:标准全文检索

-- 建索引
CREATE INDEX idx_docs_fts ON documents
USING GIN (to_tsvector('simple', title || ' ' || coalesce(excerpt, '')));

-- 查询
SELECT title,
       ts_rank(to_tsvector('simple', title), query) AS rank
FROM documents, plainto_tsquery('simple', 'docker compose') query
WHERE to_tsvector('simple', title) @@ query
ORDER BY rank DESC;

中文提示:PG 默认分词器对中文按字切分效果有限,中文重搜索建议接入 Meilisearch / zhparser,或使用 ILIKE + pg_jieba。

JSONB:文档型查询

-- 插入
INSERT INTO events (data) VALUES
('{"tool": "docker", "tags": ["devops", "container"]}');

-- 查询(包含运算符)
SELECT * FROM events WHERE data @> '{"tool": "docker"}';

-- GIN 索引加速
CREATE INDEX idx_events_data ON events USING GIN (data);

小结

  • 简单站内搜索:ILIKE 起步
  • 结构化搜索:tsvector + GIN
  • 灵活字段:JSONB + @> 运算符

PostgreSQL 一个数据库覆盖 80% 的存储场景,这是本项目选择它的原因。