Поиск префикса в базе данных PostgreSQL

#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 || '%';
 

Первое условие может использовать индекс и значительно сократит количество обращений.