【发布时间】:2021-03-09 04:55:50
【问题描述】:
这是我在处理各种不同数据集的工作中经常出现的问题,所以请原谅我笼统地介绍它,而不是使用具体的例子。
我经常需要从一个大表(通常有数百万行)中获取记录,其中文本列类似于小得多的表(10 到 100 行)中的列。我目前的做法如下,targets是较小的表,matches是较大的表。
set pg_trgm.similarity_threshold = .9;
select *
from targets as t
inner join matches as m on
t.name % m.name;
matches.name 将具有 GIN 索引,并且通常具有相对较高的唯一性,可能有 10-20% 的记录是重复的。 matches.name 和 targets.name 的长度几乎总是少于 50 个字符,而且通常短得多。
据我了解,这是一个稍微不寻常的用例:Postgres 文档和大多数 SO 答案似乎都专注于优化匹配单个值。所以我很想听听关于两个问题的想法:
- 在非常笼统的术语中(几十分钟、几小时等),并假设数据库配置最佳,就性能而言,此类查询的合理目标是什么,例如,给定 300 个目标和 3 亿个潜在目标匹配?
- 在给定参数的情况下,我目前使用的策略是最有效的策略吗?例如,是否值得尝试使用 GiST 索引并使用
<->运算符为每一行获取顶部的 n 匹配项?有没有可能更有效的完全不同的方法?
提前感谢您的帮助!
【问题讨论】:
标签: postgresql fuzzy-search postgresql-12 pg-trgm