Плохая производительность регулярных выражений для сопоставления слов в postgres - PullRequest
0 голосов
/ 30 июня 2018

У меня есть список заблокированных фраз , и я хочу сопоставить наличие этих фраз в вводимом пользователем тексте, но производительность очень плохая.

Я использую этот запрос:

SELECT value FROM blocked_items WHERE lower(unaccent( 'my input text' )) ~* ('[[:<:]]' || value || '[[:>:]]') LIMIT 1;

После моего расследования я обнаружил, что границы мира [[:<:]] и [[:>:]] работают очень плохо, зная, что в заблокированном элементе 24k записей.

Например, когда я пытаюсь запустить это:

SELECT value FROM blocked_items WHERE lower(unaccent( 'my input text ' )) ilike ('%' || value || '%') LIMIT 1;

это очень быстро по сравнению с первым. Проблема в том, что мне нужно сохранить тест на границы слов.

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

У вас, ребята, есть предложения, как сделать это быстрее?

Снимок экрана EXPLIAN ANALYZE

...