Нравится выбрать независимое существование слова, где бы ни было в тексте

dba.stackexchange https://dba.stackexchange.com/questions/1083

Вопрос

enter image description here

У меня есть таблица со следующими текстами и ключевое слово, которое я ищу, это «поиск». Так я написал запрос

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   [TextValue] LIKE '%Search%'

Q.1 Как я могу изменить запрос, так что только записи, которые «поиск» в тексте возвращались, и он не должен был принимать «LSEARCH». т.е. в соответствии с изображением первых трех записей только для возврата.

Это было полезно?

Решение

Используя как

  • Одиночная строка, как поиск:

    WHERE
     ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%'
    
    /* [] contains list of allowable characters, adding spaces around 
       [TextValue] removes need to have multiple OR [TextValue] LIKE */
    
  • Без заполнения вам нужно будет специально обработать строку, появляющуюся при запуске/конце строки:

    WHERE
        [TextValue] LIKE '%Search%' --middle
        OR
        [TextValue] LIKE 'Search%'   --start
        OR
        [TextValue] LIKE '%Search'   --end
    

Использование полного индекса

Edit2, для полного текста пуристов

CREATE FULLTEXT INDEX В штатах MSDN для опции Auto (по умолчанию)

Хотя изменения распространяются автоматически, эти изменения могут не быть отражены немедленно в полнотекстовом индексе.

Таким образом, это может не дать правильные результаты. Но затем через несколько секунд это будет.

Кроме того, для нескольких 10 -километровых рядов это будет работать адекватно: он масштабирует O (n). Я использую подобное на столе с примерно 25 тысячами строк, но пользователи знают, что он будет работать плохо, если они идут таким образом (это на странице «продвинутые»). Я получаю компромисс, управляя полным текстовым индексом

Полный текстовый поиск не а правильное решение, это один вариант

Примечание: Опыт показал мне, что полная индексация в SQL Server имеет серьезные последствия для производительности, то есть: реализация только в том случае, если вам действительно нужно, и вы знаете, что вы делаете! (@Andrew Bickerton)

Другие советы

Если ваша таблица будет иметь нетривиальное количество строк, вы можете вместо этого попробовать полный индекс полного текста. Это будет намного быстрее и будет совпадать только с точным словом.

CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;

CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
    KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table

Теперь ищите свой текст:

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   CONTAINS([TextValue], 'Search')

Еще:

Я не знаю, поддерживает ли SQL Server \b в режиме (совпадать с Word Boundry). И тебе придется Создайте определенную пользователь функцию, чтобы в первую очередь разрешить соответствие REGEX, но если это произойдет, вы могли бы соответствовать:

\bSearch\b

Если это не так, вы все равно должны быть в состоянии соответствовать:

(^| )Search( |$)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top