У меня есть список заблокированных фраз , и я хочу сопоставить наличие этих фраз в вводимом пользователем тексте, но производительность очень плохая.
Я использую этот запрос:
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