Вы можете добавить еще один вычисляемый столбец в таблицу: titleLength as len (title) PERSISTED. Это будет хранить длину столбца «заголовок». Создайте индекс по этому.
Кроме того, добавьте еще один вычисляемый столбец с именем: ReverseTitle as Reverse (title) PERSISTED.
Теперь, когда кто-то ищет ключевое слово, проверьте, совпадает ли длина ключевого слова с длиной заголовка. Если это так, выполните поиск "=". Если длина ключевого слова меньше длины titleLength, сделайте LIKE. Но сначала сделайте заголовок LIKE 'abc%', затем сделайте reverseTitle LIKE 'cba%'. Аналогично подходу Брэда - то есть вы выполняете следующий сложный запрос, только если требуется.
Кроме того, если правила 80-20 применяются к вашим ключевым словам / подстрокам (т. Е. Если большинство поисков выполняется по меньшинству ключевых слов), то вы также можете рассмотреть вопрос о том, чтобы выполнить какое-либо кэширование. Например: скажем, вы обнаружили, что многие пользователи ищут ключевое слово «abc», и этот поиск по ключевым словам возвращает записи с идентификаторами 20, 22, 24, 25 - вы можете сохранить это в отдельной таблице и проиндексировать.
А теперь, когда кто-то ищет новое ключевое слово, сначала загляните в эту таблицу «кеша», чтобы увидеть, был ли поиск уже выполнен более ранним пользователем. Если это так, не нужно снова заглядывать в основную таблицу. Просто верните результаты из таблицы "cache".
Вы также можете комбинировать вышеперечисленное с SQL Server TextSearch. (при условии, что у вас есть веская причина не использовать его). Но вы могли бы, тем не менее, сначала использовать текстовый поиск, чтобы составить список результатов. а затем запустите SQL-запрос к вашей таблице, чтобы получить точные результаты, используя идентификаторы, возвращаемые поиском TExt в качестве параметра вместе с вашим ключевым словом.
Все это, очевидно, предполагает, что вы должны использовать SQL. Если нет, вы можете исследовать что-то вроде Apache Solr.