Нравится выбрать независимое существование слова, где бы ни было в тексте
-
16-10-2019 - |
Вопрос
У меня есть таблица со следующими текстами и ключевое слово, которое я ищу, это «поиск». Так я написал запрос
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( |$)