在 PostgreSQL 表中快速搜索字符串,输入略有错误

问题描述 投票:0回答:1

假设我在 PostgreSQL 中有一个

user
表,其中包含列

first_name (PK)
last_name (PK)
email

目前已有数百万用户。一名用户有该记录

(John, Smith, [email protected])

现在搜索他,输入错误

Johny Smit

我怎样才能快速找到记录? sqlalchemy 也可以吗?

postgresql indexing sqlalchemy full-text-search
1个回答
0
投票

您可以使用 pg_trgm 扩展中包含的基于

trigram
的索引和搜索:demo

create extension pg_trgm;
create index trgm_idx on my_table using GiST ( first_name gist_trgm_ops
                                              ,last_name  gist_trgm_ops);
select * from my_table 
where    first_name % 'Johny' 
  and    last_name  % 'Smit' 
order by first_name<->'Johny'
        ,last_name <->'Smit'
limit 5;
名字 姓氏 电子邮件
约翰 史密斯 [电子邮件受保护]
查询计划
限制(成本=0.28..8.31行=1宽度=119)(实际时间=19.341..19.353行=1循环=1)
  输出:名字、姓氏、电子邮件、((名字 <-> 'Johny'::text)), ((姓氏 <-> 'Smit'::text))
  -> 在 public.my_table 上使用 trgm_idx 进行索引扫描(成本=0.28..8.31行=1宽度=119)(实际时间=19.337..19.348行=1循环=1)
        输出:名字,姓氏,电子邮件,(名字<->'Johny'::text),(姓氏<->'Smit'::text)
        索引条件:((my_table.first_name % 'Johny'::text) AND (my_table.last_name % 'Smit'::text))
        订购依据:((my_table.first_name <-> 'Johny'::text) AND (my_table.last_name <-> 'Smit'::text))
规划时间:1.364毫秒
执行时间:19.416 ms
  1. 在现实生活中,它不会这么快,因为我只是将
    John Smith
    埋在一堆 100k 随机
    uuid
    下。
  2. 您将不得不调整您的相似性目标,并且仍然可能搜索许多最佳匹配项,并以某种方式从中挑选出来 - 可能有很多人的名字也与您的搜索匹配。
© www.soinside.com 2019 - 2024. All rights reserved.