2013-04-09 2 views
1

У меня есть база данных postgresql с таблицей, содержащая около 50 миллионов записей строк, которые являются адресами. Пример струнСоответствие строки для нескольких регулярных выражений

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

т.д.

Теперь я должен проверить, если адрес совпадает с любым из списка около 30 000 регулярных выражений. Мне также нужно знать, какое регулярное выражение соответствует. Примерами регулярных выражений являются

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

Это, конечно, в формате «LIKE» для postgres. Поскольку сопоставление регулярных выражений не может воспользоваться индексированием (не так много, я уже проиндексировал поле varchar_pattern_ops), общее время работы этой операции составит около 30000x50 миллионов.

Я также могу использовать python для сопоставления регулярных выражений, если существует какая-либо библиотека python, которая поможет мне ускорить процесс.

Спасибо за помощь!

+0

30000 регулярных выражений: это довольно много, вы можете скомпилировать их первым, если это будет повторяться в течение нескольких запросов. –

+0

Что именно вы подразумеваете под «компиляцией»? Запрос базы данных postgresql не требует компиляции afaik. И это не повторится. Это одноразовая операция. – amhrpi

+1

Не уверен, что вы правы в том, что postgres могут использовать индексы с такими запросами. Если у вас есть '%' в начале выражения, он все равно будет вызывать сканирование seq. Убедитесь, что вы проверили 'EXPLAIN' –

ответ

1

Что случилось с:

CREATE TABLE regex (
    regex text primary key 
); 

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

Это похоже на самый быстрый вариант, поскольку он использует 'JOIN' для выполнения соответствия регулярных выражений. Вероятно, в любом случае ускорить это не удастся. Благодарю. – amhrpi

Смежные вопросы