Поиск слов в индексе SQL Server - PullRequest
       8

Поиск слов в индексе SQL Server

5 голосов
/ 01 октября 2008

Мне нужно что-то среднее между полнотекстовым поиском и поиском по индексу:
Я хочу найти текст в одном столбце моей таблицы (возможно, в столбце также будет индекс, если это имеет значение).

Проблема в том, что я хочу искать слова в столбце, но не хочу сопоставлять части.

Например, мой столбец может содержать названия компаний:
Могучий Мак Миллер и Партнеры Инк.
Компания Boy & Butter Breakfast

Теперь, если я ищу " Миллер ", я хочу найти первую строку. Но если я ищу « iller », я не хочу его искать, потому что нет слова, начинающегося с «iller». Однако при поиске " Break " должно быть найдено " Boy & Butter Breakfast company ", поскольку одно слово начинается с " Break ".

Так что, если я попытаюсь использовать

WHERE BusinessName LIKE %Break%

найдет слишком много хитов.

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

(LINQ будет лучше, обычный SQL тоже подойдет)

Важно: Пробелы - далеко не единственные разделители! Для того, чтобы это работало, необходимо учитывать косые черты, двоеточия, точки и все не алфавитно-цифровые символы!

Ответы [ 6 ]

6 голосов
/ 01 октября 2008

Разделителей слов будет много: пробел, табуляция, начало строки, скобки, точки, запятые, восклицательные знаки / вопросительные знаки и т. Д. Итак, довольно простое решение - использовать регулярное выражение в предложении WHERE. (И это будет намного эффективнее, чем просто ИЛИ каждый возможный разделитель, который вы можете придумать.)

Поскольку вы упомянули LINQ, вот статья, в которой описывается, как эффективно выполнять регулярные выражения с SQL Server .

Сложные предложения WHERE, подобные этому, всегда поднимают красный флажок со мной, что касается производительности, поэтому я определенно рекомендую сравнить все, что у вас получится, в конце концов, вы можете решить создать поисковый индекс для столбца.

РЕДАКТИРОВАТЬ: Увидел, что вы редактировали свой вопрос. Когда записывает ваше регулярное выражение , легко просто использовать любой не алфавитный символ в качестве разделителя, то есть [^ 0-9a-zA-Z], или \ W для любого несловарного символа, \ b для любой границы слова и \ B для любой границы не слова. Или вместо сопоставления разделителей просто сопоставьте любое слово, т.е. \ w +. Вот другой пример того, как кто-то выполняет поиск регулярных выражений с SQL Server (более сложный, чем вам нужно).

4 голосов
/ 01 октября 2008
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
3 голосов
/ 02 октября 2008

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

Ссылка на ключевое слово для LIKE : http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx

1 голос
/ 01 октября 2008

Вы упомянули LINQ - вы могли бы сделать что-то вроде ...

string myPattern = "% Break%";

var query =
      from b in Business
      where SqlMethods.Like(b.BusinessName, myPattern) 
      select b;

Обратите внимание, что здесь используется пространство имен System.Linq.Data.SqlClient, которое преобразуется непосредственно в оператор LIKE без дополнительной обработки.

1 голос
/ 01 октября 2008
WHERE BusinessName LIKE '% Break%'
0 голосов
/ 09 марта 2010

Попробуйте это:

declare @vSearch nvarchar(100)

set @vSearch = 'About'

select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...