Поиск слов в индексе SQL Server
-
03-07-2019 - |
Вопрос
Мне нужно что-то среднее между полнотекстовым поиском и поиском по индексу:
Я хочу выполнить поиск текста в одном столбце моей таблицы (вероятно, для этого столбца тоже будет индекс, если это имеет значение).
Проблема в том, что я хочу искать слова в столбце, но не хочу сопоставлять части.
Например, мой столбец может содержать названия компаний:
Могучий Мак Миллер и партнеры, Inc.
Компания Boy & Butter Breakfast
Теперь, если я ищу "Миллер«Я хочу найти первую линию.Но если я ищу "Иллер"Я не хочу его искать, потому что нет слова, начинающегося на "иллер".Ищу "Перерыв"должен найти"Компания Boy & Butter Breakfast", однако, поскольку одно слово начинается с "Перерыв".
Итак, если я попробую использовать
WHERE BusinessName LIKE %Break%
он найдет слишком много совпадений.
Есть ли способ поиска слов, разделенных пробелами? или другие разделители?
(Лучше всего подойдет LINQ, подойдет и простой SQL)
Важный: Пробелы — далеко не единственные разделители!Чтобы это работало, следует учитывать косые черты, двоеточия, точки и все небуквенно-цифровые символы!
Решение
SQL Server 2000 или выше.
SELECT *
FROM dbo.TblBusinessNames
WHERE BusinessName like '%[^A-z^0-9]Break%' -- In the middle of a sentence
OR BusinessName like 'Break%' -- At the beginning of a sentence
Справочник ключевых слов для НРАВИТЬСЯ: http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx
Другие советы
Разделителей слов будет много:пробел, табуляция, начало строки, круглые скобки, точки, запятые, восклицательные/вопросительные знаки и т. д.Итак, довольно простое решение — использовать регулярное выражение в предложении WHERE.(И это будет намного эффективнее, чем просто ИЛИ для всех возможных разделителей, которые вы только можете придумать.)
Поскольку вы упомянули LINQ, вот статья, в которой описывается, как это сделать. эффективный запрос регулярных выражений с помощью SQL Server.
Сложные предложения WHERE, подобные этому, всегда вызывают у меня красный флаг с точки зрения производительности, поэтому я определенно предлагаю протестировать все, что у вас получится в итоге, возможно, вы все-таки решите создать индекс поиска для столбца.
РЕДАКТИРОВАТЬ: Видел, что вы отредактировали свой вопрос.Когда написание вашего регулярного выражения, легко просто использовать в качестве разделителя любой небуквенный символ, т.е.[^0-9a-zA-Z] или \W для любого символа, не являющегося словом, \b для любой границы слова и \B для любой границы, не являющейся словом.Или вместо сопоставления разделителей просто сопоставьте любое слово, т.е.\w+.Вот другой пример о том, как кто-то выполняет поиск по регулярным выражениям с помощью SQL Server (более сложно, чем вам нужно).
where BusinessName like 'Break%' -- to find if it is beginning with the word
or BusinessName like '% Break%' -- to find if it contains the word anywhere but the beginning
WHERE BusinessName LIKE '% Break%'
Вы упомянули LINQ - вы могли бы сделать что-то вроде...
string myPattern = "% Break%";
var query =
from b in Business
where SqlMethods.Like(b.BusinessName, myPattern)
select b;
Обратите внимание, что здесь используется System.Linq.Data.SqlClient
пространство имен, которое транслируется непосредственно в LIKE
оператор без дополнительной обработки.
Попробуй это:
declare @vSearch nvarchar(100)
set @vSearch = 'About'
select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'