喜欢在文本中选择单词的独立存在
-
16-10-2019 - |
题
我有一个带有以下文本的表,我要搜索的关键词是“搜索”。所以我写了一个查询
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
[TextValue] LIKE '%Search%'
Q.1 如何修改查询,以便返回文本中的“搜索”记录,并且不应该接受“ lsearch”。 IE根据图像前三个记录仅返回。
解决方案
使用喜欢
单行等搜索:
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
使用FullText索引
edit2,全文纯粹主义者
CREATE FULLTEXT INDEX
关于自动选项的MSDN状态(默认)
尽管更改会自动传播,但这些更改可能不会立即反映在全文索引中。
因此,它可能无法给出正确的结果。但是几秒钟后它将。
另外,对于最多只有10k行,它将表现出足够的性能:它缩放o(n)。我在一个大约25k行的桌子上使用类似,但用户知道,如果他们以这种方式搜索它会表现不佳(它在“高级”页面上)。我通过管理全文索引来取得权衡
全文搜索不是 这 正确的解决方案,是 一 选项
笔记: 经验表明,SQL Server中的FullText索引具有严重的性能含义,即:仅在您真正需要的情况下实施,并且您知道自己在做什么! (@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
在Regexes中(在单词边界上匹配)。而且你必须 创建一个用户定义的功能,以允许首先匹配正则匹配, ,但是如果这样做,您可以匹配:
\bSearch\b
如果没有,您仍然应该能够匹配:
(^| )Search( |$)
不隶属于 dba.stackexchange