2013-04-09 106 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