php PGSQL相似性的最佳优化

06odsfpq  于 2023-02-28  发布在  PHP
关注(0)|答案(2)|浏览(204)

我是初学者php开发。我需要在我的项目中使用pgsql函数相似。
我有表:

CREATE TABLE IF NOT EXISTS table_name
    (id serial primary key, 
     prg_id TEXT,  
     code TEXT,  
     city TEXT,  
     area TEXT, 
     street TEXT, 
     numer TEXT,, 
     address TEXT)

这张table很大.
现在我需要在这个表中搜索。
我有SQL示例:

SELECT street,  
     similarity('street'  , 'name street') AS similarity,  
     row_number() OVER () AS rank  
     FROM   table_name  
     where street% 'name street'  
     order by rank LIMIT  1;

是工作,但是很慢。
有没有可能把这道题写得更好,使它更有效率?

w80xi6nr

w80xi6nr1#

如果您稍微重写查询并创建GiST索引,它会很快:

CREATE INDEX ON table_name USING gist (street gist_trgm_ops);

然后,您必须使用距离运算符<->来代替similarity函数:

SELECT street,  
       street <-> 'name street' AS distance
       row_number() OVER () AS rank
FROM table_name  
ORDER BY distance
LIMIT 1;

这将为您提供street'name street'最相似的行。如果您想排除不够相似的结果,可以添加WHERE条件。

ryevplcw

ryevplcw2#

安装扩展pg_trgm,在此列上创建索引:

CREATE INDEX trgm_idx ON table_name USING GIST (street gist_trgm_ops);

并使用EXPLAIN(ANALYZE,VERBOSE,BUFFERS,SETTINGS)为您的SQL语句获得查询计划。它是否有所改进?

相关问题