PostgreSQL 的全文搜索功能允许对文本数据进行复杂的搜索查询,支持词干提取、停用词过滤和相关性排序等功能。它基于tsvector
和tsquery
数据类型。
Trigram 是三个连续字符的分组,PostgreSQL 通过pg_trgm
扩展提供 trigram 支持,常用于模糊匹配、拼写纠正和相似性搜索。
CREATE EXTENSION pg_trgm;
CREATE OR REPLACE FUNCTION combined_search(search_term text)
RETURNS TABLE(id integer, title text, rank float) AS $$
BEGIN
RETURN QUERY
SELECT
t.id,
t.title,
-- 结合全文搜索和 trigram 相似度的加权排名
(ts_rank(to_tsvector('english', t.title), plainto_tsquery('english', search_term)) * 0.7 +
similarity(t.title, search_term) * 0.3) AS rank
FROM
articles t
WHERE
to_tsvector('english', t.title) @@ plainto_tsquery('english', search_term)
OR t.title % search_term
ORDER BY
rank DESC;
END;
$$ LANGUAGE plpgsql;
-- 全文搜索索引
CREATE INDEX idx_fts_title ON articles USING gin(to_tsvector('english', title));
-- Trigram 索引
CREATE INDEX idx_trgm_title ON articles USING gin(title gin_trgm_ops);
-- 简单查询
SELECT * FROM combined_search('database management');
-- 带阈值的查询
SELECT * FROM combined_search('database management') WHERE rank > 0.1;
问题1:搜索速度慢
问题2:结果不相关
问题3:内存不足
通过合理组合全文搜索和 trigram,可以在 PostgreSQL 中实现强大而灵活的文本搜索功能,兼顾精确匹配和模糊匹配的需求。
没有搜到相关的文章