首页 > 解决方案 > 在长文本字段上使用 PostgreSQL trigrams 进行慢速模糊搜索

问题描述

当我在 PostgreSQL 中对一组相对较小的记录 (8k) 执行模糊文本搜索时,我看到查询速度很慢(约 20 秒)。我已经设置了 GIN 和 GIST trigram 索引,并通过 ANALYZE 确认它们正在被使用。性能似乎是由少数具有很长文本字段的记录驱动的。虽然大多数记录都在 2k 字符以下,但大约 200 条超过 10k,少数超过 20k。将这些长字符串截断为 10k 个字符可将查询时间缩短到 8 秒。

我已经尝试过 PostgreSQL 10 和 11、GIN 和 GIST 索引,但性能没有实质性变化。

我尝试将文本内容分成更多的记录,每条记录都小得多。搜索分布在更多记录中的相同文本会导致亚秒级查询。

该查询完全不起眼:

select title, 
'orthopedic surgeon' <<-> content as sml
from answers
where 'orthopedic surgeon' <% content
order by sml desc

有了这么少的记录,我希望三元组索引能够提供近乎即时的结果,即使我的文本字段有 30k+ 个字符。我不希望通过将内容拆分到更多记录来实现更快的查询。这种表现正常吗?

标签: databasepostgresqlperformancefull-text-search

解决方案


推荐阅读