2013-04-09 108 views
1

我有一个postgresql数据库,其中包含大约5000万个地址字符串条目。字符串的例子是在多个正则表达式中匹配字符串

NIAID, Opportunist Infect Res Branch, Treatment Res Programs, Div Aids, Bethesda, MD USA 
PRINCETON UNIV,DEPT PSYCHOL,PRINCETON,NJ 08544 

现在我要检查,如果地址匹配任何的约30000正则表达式列表。我也需要知道哪个正则表达式匹配。正则表达式的示例是

%umass mem med ctr worcester%worcester%ma% 
%darnnouth% 

这当然是'LIKE'格式的postgres。由于正则表达式匹配无法利用索引(不管怎样,我已经对varchar_pattern_ops字段进行了索引),所以此操作的总运行时间将约为3亿5千万。

我还可以使用python来执行正则表达式匹配,如果存在任何python库,这将帮助我加快进程。

感谢您的帮助!

+0

30000正则表达式:这是相当多的,你可能想先编译他们,如果这将是重复几个查询。 – 2013-04-09 14:38:43

+0

“编译”是什么意思?查询postgresql数据库不需要编译afaik。它不会被重复。这是一次性操作。 – amhrpi 2013-04-09 15:34:08

+1

不确定你对postgres能否像这样的查询使用索引是正确的。如果你在表达式的开头有'%',那么它仍然会导致seq扫描。确保你检查'EXPLAIN' – 2013-04-09 15:55:07

回答

1

出了什么问题:

CREATE TABLE regex (
    regex text primary key 
); 

SELECT * FROM my_table 
    JOIN regex ON mytextfield like regex; 
+0

这似乎是最快的选择,因为它使用'JOIN'来执行正则表达式匹配。可能还没有办法进一步加快这一进程。谢谢。 – amhrpi 2014-07-16 00:37:49