Вопрос

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

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

Например, мой столбец может содержать названия компаний:
Могучий Мак Миллер и партнеры, 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]%'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top