Используя полный текстовый запрос, вы можете предоставить конечному пользователю большую гибкость в том, как они строят свой поиск. Кроме того, вам не нужно выполнять столько раз синтаксического анализа строки поиска, и поиск обычно выполняется быстрее, чем при использовании LIKE.
1. Создайте полный текстовый каталог и указатель.
CREATE FULLTEXT CATALOG [ftcat_Books] WITH ACCENT_SENSITIVITY = OFF
GO
CREATE FULLTEXT INDEX ON [Books] ([Title] LANGUAGE 'English', [Board] LANGUAGE 'English', [Class] LANGUAGE 'English')
KEY INDEX [PK_Books] ON ([ftcat_Books], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = OFF)
Ваш столбец Books.Class должен быть VARCHAR или NVARCHAR для этой работы.
Я рекомендую не использовать стоп-листы (STOPLIST = OFF
), так что цифры без цифры, например 9 в вашем примере, не игнорируются.
More about accent sensitivity (Этот пример не использует чувствительность акцента)
More about change tracking (В данном примере используется отслеживание изменений) запросов пользователей
2. Преобразовать в булев синтаксис.
Когда пользователь набирает 9 CBSE
, его необходимо будет преобразовать в "9" AND "CBSE"
. Каждый термин должен быть окружен двойными кавычками и разделен «И». (Вы также можете использовать символы OR, NOT, NEAR и wildcards, но я не уверен, что они вам нужны в вашем случае.)
Вот простой способ преобразования в булевский синтаксис, который вам нужен с использованием .NET regex (в основном, заменить каждая серия 1+ пространств с " AND "
и окружать результат с большим количеством двойных кавычек):
// assume searchString = "9 CBSE"
string searchStringBoolean = "\"" + Regex.Replace(searchString, @"\s+", "\" AND \"") + "\"";
Имейте в виду, что это очень простой подход. Вам нужно будет рассмотреть, что делать, если пользователь уже вводил двойные кавычки или AND в своей строке поиска.
3. Запустите полный текстовый запрос.
-- @SearchStringBoolean is the boolean string created in step 2
SELECT TOP 100 Books.Title, Books.Board, Books.Class
FROM ContainsTable(Books, *, @SearchStringBoolean) as FullTextResults
join Books on FullTextResults.KEY = Books.Id
ORDER BY FullTextResults.RANK desc
Это возвращает 100 лучших матчей с лучшими отсортированные первым.
У вас нет плана для ввода трех разных текстовых полей? – Steve
есть ли какой-нибудь заказ на поисковые слова? – DarkKnight
Что делать, если пользователь вводит «9 E», если он найдет как английский, так и CBSE или ни один из них? –