Вы говорите, что у вас есть миллионы коротких строк, поэтому я предполагаю, что вы не можете хранить ее в ОЗУ и хранить в базе данных.
Предположим, вы храните свои «короткие строки» в таблице с именем my_string (id, string).
Создайте еще одну таблицу, назовем ее my_substring (id, substring [unique]), содержащую каждую подстроку каждой строки в my_string.
Также создайте объединяющую таблицу для двух таблиц выше: my_substring_to_string (id, substring_id, string_id), ее содержимое очевидно, я полагаю.
Теперь поиск выполняется просто и быстро: найдите подстроку в my_substring (не забудьте создать индекс для my_substring.substring) и присоедините ее к my_string через my_substring_to_string.
Добавление и удаление новой короткой строки потребует обновления в my_substring и my_substring_to_string, но это довольно просто.
Если это решение создаст таблицу my_substring с недопустимо большим размером, его можно оптимизировать. Вместо сохранения каждой подстроки попробуйте сохранить каждый суффикс и найдите «substring%» с помощью ilike.
Например, если слово «блюз», вы должны хранить суффиксы:
'blues', 'lues', 'ues', 'es', 's' (соединены с 'blues'). Тогда поиск по 'lu' (ilike 'lu%') будет соответствовать 'lues'. Таким образом, база данных все еще будет в состоянии использовать индекс, созданный для столбца my_substring.substring, поэтому поиск по-прежнему будет быстрым.