Gar*_*Tao 5 postgresql pattern-matching nearest-neighbor bigdata pg-trgm
我的PostgreSQL 9.3 DB中有3亿个地址,我想用pg_trgm模糊搜索行.最终目的是实现与谷歌地图搜索一样的搜索功能.
当我使用pg_trgm搜索这些地址时,获得结果需要大约30秒.有许多行符合0.3的默认相似性阈值条件,但我只需要大约5或10个结果.我创建了一个trigram GiST索引:
CREATE INDEX addresses_trgm_index ON addresses USING gist (address gist_trgm_ops);
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
SELECT address, similarity(address, '981 maun st') AS sml
FROM addresses
WHERE address % '981 maun st'
ORDER BY sml DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
生产环境的测试表已被删除.我显示了EXPLAIN测试环境的输出.大约有700万行,它需要大约1.6秒来获得结果.拥有3亿,需要30多个.
ebdb=> explain analyse select address, similarity(address, '781 maun st') as sml from addresses where address % '781 maun st' order by sml desc limit 10;
QUERY PLAN
————————————————————————————————————————————————————————————————————————————————
Limit (cost=7615.83..7615.86 rows=10 width=16) (actual time=1661.004..1661.010 rows=10 loops=1)
-> Sort (cost=7615.83..7634.00 rows=7268 width=16) (actual time=1661.003..1661.005 rows=10 loops=1)
Sort Key: (similarity((address)::text, '781 maun st'::text))
Sort Method: top-N heapsort Memory: 25kB
-> Index Scan using addresses_trgm_index on addresses (cost=0.41..7458.78 rows=7268 width=16) (actual time=0.659..1656.386 rows=5241 loops=1)
Index Cond: ((address)::text % '781 maun st'::text)
Total runtime: 1661.066 ms
(7 rows)
Run Code Online (Sandbox Code Playgroud)
是否有提高性能的好方法,还是进行表分区的好计划?
PostgreSQL 9.3 ...是否有提高性能的好方法,还是进行表分区的好计划?
表分区将不利于所有。
但是,是的,有一个好方法:升级到最新版本的Postgres。GiST索引,尤其是pg_trgm模块,以及大数据的总体改进。使用Postgres 9.6或即将推出的Postgres 10(目前为beta)应该会更快。
您“最接近的邻居”看起来是正确的,但是对于一小部分,请LIMIT使用以下等效查询:
SELECT address, similarity(address, '981 maun st') AS sml
FROM addresses
WHERE address % '981 maun st'
ORDER BY address <-> '981 maun st'
LIMIT 10;Run Code Online (Sandbox Code Playgroud)
当只需要少量最接近的匹配项时,通常会击败第一个公式。
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |