Короткий ответ
Не существует эффективного способа выполнить поиск в инфиксах в SQL Server, ни с использованием LIKE
в индексированном столбце, ни с полнотекстовым индексом.
Длинный ответ
В общем случае полнотекстового эквивалента оператору LIKE не существует.В то время как LIKE работает со строкой символов и может выполнять произвольные сопоставления с подстановочными знаками для всего, что находится внутри цели, по замыслу полный текст работает только с целыми словами / терминами.(Это небольшое упрощение, но оно пригодится для целей этого ответа.)
Полный текст SQL Server поддерживает подмножество LIKE с префиксным оператором термина.Из документов (http://msdn.microsoft.com/en-us/library/ms187787.aspx):
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
будут возвращаться продукты с именами цепная пила, цепная почта и т. Д. Функционально это ничего не даст вам по сравнению со стандартным оператором LIKE
(LIKE 'Chain%'
) и, какПока столбец индексируется, использование LIKE для поиска с префиксом должно обеспечивать приемлемую производительность.
Оператор LIKE позволяет помещать подстановочный знак в любом месте, например LIKE '%chain'
, и, как вы упомянули, это не позволяет индексуиспользуется, но с полным текстом звездочка может появиться только в конце термина запроса, так что это вам не поможет.
Используя LIKE, является возможным для эффективного выполнения. postfix выполняет поиск путем создания нового столбца, установки его значения в обратном направлении к целевому столбцу и его индексации. Затем можно выполнить запрос следующим образом:
SELECT Name
FROM Production.Product
WHERE Name_Reversed LIKE 'niahc%'; /* "chain" backwards */
, который возвращает товары с их названиямизаканчивая "chain".
Полагаю, вы могли бы затем объединить префикс и обратный постфиксный хак:
SELECT Name
FROM Production.Product
WHERE Name LIKE 'chain%'
AND Name_Reversed LIKE 'niahc%';
, который реализует (потенциально) индексd инфиксный поиск, но он не особенно хорош (и я никогда не проверял это, чтобы увидеть, будет ли оптимизатор запросов использовать оба индекса в своем плане).