2016-05-24 3 views
2

У меня есть столбец с названиями продуктов. Некоторые имена выглядят как «ab-cd» ab cd Можно ли использовать полнотекстовый поиск для получения этих имен, когда пользователь вводит «abc» (без пробелов)? Оператор like работает для меня, но я хотел бы узнать, можно ли использовать полнотекстовый поиск.Полный текстовый поиск и пробелы SQL Server

+4

Полный текст поиска - * язык * предназначенный. Он работает с точки зрения * слов * и * фраз *. Вы не должны ожидать, что он будет работать с пробелами или пунктуацией, которые он уже использует, чтобы * отделить слова. –

ответ

1

Нет, к сожалению, вы не можете осуществлять такой поиск через полнотекстовый текст. Вы можете использовать только LIKE в этом случае LIKE ('ab%c%')

EDIT1:

Вы можете создать представление (WITH SCHEMABINDING!) С некоторыми id и имя столбца, в котором вы хотите искать:

CREATE VIEW dbo.ftview WITH SCHEMABINDING 
AS 
SELECT id, 
     REPLACE(columnname,' ','') as search_string 
FROM YourTable 

Затем создайте индекс

CREATE UNIQUE CLUSTERED INDEX UCI_ftview ON dbo.ftview (id ASC) 

Тогда cre ate полнотекстовый индекс поиска на search_string поле.

После этого вы можете запросить CONTAINS запрос с поиском "abc*" и он найдет то, что вам нужно.

EDIT2:

Но это не поможет, если search_string не начинается с поиска.

Например:

AB C d -> ABCD и поиске cd

+0

Я не понимаю вашего комментария. OP писал: * Можно ли использовать полнотекстовый поиск, чтобы получить эти имена, когда пользователь вводит «abc» (без пробелов) *, так что о «не используя FTS». Просьба уточнить. – gofr1

+0

извинился, не прочитал ваш ответ. Тем не менее, я не думаю, что объединение всех слов в один супер-термин - разумное решение. Что вы будете делать, если сверхсрочный срок не начинается с вашего первого поискового запроса. – Jodrell

+0

Вы правы, это проблема. Спасибо, я должен добавить эту информацию в свой ответ. – gofr1

1

No. полнотекстовый поиск на основе слов и фраз. Он не сохраняет исходный текст. Фактически, в зависимости от конфигурации он даже не сохранит все слова - есть так называемые стоп-слова, которые никогда не входят в индекс. Пример: на английском языке слово «in» не является достаточно избирательным, чтобы считаться заслуживающим хранения.

Некоторые имена похожи на «AB-CD» «AB CD»

Те, вероятно, не сохраняются вообще. По крайней мере, второй пример на самом деле является 2 чрезвычайно короткими словами - вполне вероятно, что они полностью игнорируются.

Таким образом, нет - полный текстовый поиск не подходит для этого.

+0

на самом деле '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. – Jodrell

+0

Я не уверен, что нет также минимальной длины слова - поэтому ab и cd можно просто проигнорировать из-за этого. – TomTom

+0

'ab-cd' 'ab cd' - это были не реальные данные, просто пример. И спасибо за ответ - «полнотекстовый поиск не подходит для этого» - вот что я хотел знать – Serg88

1

Если вы хотите использовать FTS, чтобы найти термины, которые находятся рядом друг с другом, например слова, разделенные пробелом, вы должны использовать термин близости.

Вы можете определить термин близости, используя ключевое слово NEAR или оператор ~ в выражении поиска, as documented here.

Так что, если вы хотите найти ab сразу за cd вы могли бы использовать выражение,

'NEAR((ab,cd), 0)' 

ищет слово ab с последующим словом cd с 0 в терминах между ними.

+0

Но если пользователь поместил 'abc' в строку поиска, как бы я теперь, чтобы 'NEAR ((ab, cd), 0)' был создан? – Serg88

+0

@ serg88, по-видимому, вам придется разбирать текст и искать «abc | a-bc | ab-c | abc | NEAR ((a, bc), 0) | NEAR ((ab, c), 0) | NEAR ((a, b, c), 0) '', так как длина строки продолжается, вы можете увидеть, что сложность будет расти экспоненциально. – Jodrell

Смежные вопросы