[ PROMPT_NODE_23502 ]
advanced-full-text-search
[ SKILL_DOCUMENTATION ]
## 使用 tsvector 进行全文搜索
带有通配符的 LIKE 无法使用索引。使用 tsvector 的全文搜索速度要快几个数量级。
**不正确(LIKE 模式匹配):**
sql
-- 无法使用索引,扫描所有行
select * from articles where content like '%postgresql%';
-- 大小写不敏感使其更糟
select * from articles where lower(content) like '%postgresql%';
**正确(使用 tsvector 的全文搜索):**
sql
-- 添加 tsvector 列和索引
alter table articles add column search_vector tsvector
generated always as (to_tsvector('english', coalesce(title,'') || ' ' || coalesce(content,''))) stored;
create index articles_search_idx on articles using gin (search_vector);
-- 快速全文搜索
select * from articles
where search_vector @@ to_tsquery('english', 'postgresql & performance');
-- 带排名
select *, ts_rank(search_vector, query) as rank
from articles, to_tsquery('english', 'postgresql') query
where search_vector @@ query
order by rank desc;
搜索多个术语:
sql
-- AND:两个术语都必须存在
to_tsquery('postgresql & performance')
-- OR:任一术语
to_tsquery('postgresql | mysql')
-- 前缀匹配
to_tsquery('post:*')
参考:[全文搜索](https://supabase.com/docs/guides/database/full-text-search)