Короткий ответ
Не существует эффективного способа выполнения поиска по инфиксу в 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 */
который возвращает продукты, имена которых заканчиваются на «цепочка».
Я полагаю, вы могли бы затем объединить префикс и обратный постфиксный взлом:
SELECT Name
FROM Production.Product
WHERE Name LIKE 'chain%'
AND Name_Reversed LIKE 'niahc%';
который реализует (потенциально) индексированный поиск по инфиксу, но это не особенно красиво (и я никогда не проверял это, чтобы увидеть, будет ли оптимизатор запросов даже использовать оба индекса в своем плане).
person
Mike Chamberlain
schedule
01.12.2010