#postgresql #search #prefix
#postgresql #Поиск #префикс
Вопрос:
В настоящее время я пишу средство проверки на спам. Одним из его аспектов является проверка плохих ссылок. У меня есть большая база данных (несколько миллионов) заведомо плохих префиксов URL, которые довольно часто расширяются, и я хотел бы очень быстро сравнить любой URL, который я получаю, с этой базой данных — то, что я, вероятно, сделал бы с trie, если бы память не была проблемой.
Пример базы данных:
evil.example.com
innocentlookingblog.com/compromisedpage
baduser@gooddomain.com
Теперь, если я получаю URL innocentlookingblog.com/compromisedpage/you-have-won.exe
, я хочу быстро определить, что это неверный URL, потому innocentlookingblog.com/compromisedpage
что это префикс.
Есть ли хороший способ сделать это в PostgreSQL? Насколько я могу судить, ни один из типов индексов, похоже, не предназначен для такого поиска, в котором таблица содержит префиксы, а данные содержат полный текст.
Ответ №1:
Вы могли бы использовать условие фильтра, чтобы уменьшить количество совпадений. Предполагая, что все префиксы имеют длину не менее 10 символов, создайте этот индекс:
CREATE INDEX ON spammers (substr(prefix, 1, 10));
Затем запрос типа
SELECT count(*) FROM spammers
WHERE substr(prefix, 1, 10) = substr('theurl.com/something', 1, 10)
AND 'theurl.com/something' LIKE prefix || '%';
Первое условие может использовать индекс и значительно сократит количество обращений.