В этом вопросе у него такая же проблема, как и у меня. Мне нужно что-то вроде:
select * from blablabla
where product
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Это ужасно и не использует индексы. В этом случае это действительно единственный способ сделать это (выбрать несколько слов внутри строки), или мне следует использовать FULLTEXT?
Как я понимаю, с полным текстом я могу выделить несколько слов внутри строки.
sql-server
sql-server-2008-r2
full-text-search
Racer SQL
источник
источник
Ответы:
Полнотекстовые индексы обычно не являются волшебной палочкой и требуют дополнительного обслуживания, дискового пространства и довольно навязчивых изменений в шаблонах запросов.
Если вам действительно не нужно индексировать большие документы (например, электронные письма, PDF-файлы, документы Word и т. Д.), Они излишни (и, если честно, я бы полностью исключил этот процесс из SQL Server и используйте Elasticsearch или что-то подобное).
Для небольших вариантов использования вычисляемые столбцы обычно являются лучшим подходом.
Вот быстрая демонстрационная установка:
Запросы, основанные даже на непостоянном столбце, дают нам план, который «использует индексы» и все :)
источник
Ответ sp_BlitzErik имеет много положительных моментов, но я не думаю, что вам не следует использовать полнотекстовый поиск. Полнотекстовый поиск не для того, чтобы делать то, что вы думаете. Это не для поиска по нескольким полям. Это там, чтобы векторизовать содержание слов и использовать словари, заглушки, лексеры, газеты, исключение стоп-слов и множество других трюков, ни один из которых не применим. Или еще не было показано, чтобы применить.
Я также не согласен с решением, хотя я не уверен, как сделать это лучше в SQL Server. Давайте воссоздадим его данные для PostgreSQL - в PostgreSQL его создавать намного чище.
Теперь, что вы хотите, это тип enum,
Теперь вы свернули строки в целочисленные представления. Но даже лучше, вы можете запросить их, как раньше.
Это имеет эффект.
Без этих преимуществ вы, по сути, просто пытаетесь оптимизировать сравнение строк. Но, увы, я даже не уверен, как sp_BlitzErik получает ответ, учитывая код в предложении,
Вы можете свернуть токены до целых чисел, используя enum, или метод ручного прокрутки, предложенный sp_BlitzErik, но если вы можете сделать свертывание, почему вы тоже делаете unanchored-like? То есть, если вы знаете, что «% pasta%» является символом «макароны», почему у вас есть
%
обе стороны от него? Без «%» это проверка на равенство, и она должна работать довольно быстро даже в виде текста.источник