SQL 包含确切的短语
Posted
技术标签:
【中文标题】SQL 包含确切的短语【英文标题】:SQL Contains exact phrase 【发布时间】:2015-04-27 04:48:32 【问题描述】:我尝试在 SQL Server 2014 上使用“CONTAINS()”实现搜索机制。
我在这里阅读了https://technet.microsoft.com/en-us/library/ms142538%28v=sql.105%29.aspx 和“SQL Server 2008 中的专业全文搜索”一书,我需要使用双引号来搜索确切的短语。
但是等式。如果我使用这个CONTAINS(*, '"test"')
我也会收到包含“numerictest”之类的单词的结果。如果我尝试CONTAINS(*, '" test "')
它是一样的。我注意到,结果较少,就像我用CONTAINS(*, '*test*')
搜索前缀、后缀搜索一样,所以搜索之间肯定存在增量。
我没想到第一个语句中的“numerictest”。这种行为有解释吗?
【问题讨论】:
首先,您提供的链接上的间距与您的示例代码不同,您是否尝试过:CONTAINS(*, ' "test" ')
这不是 Contains() 应该做的吗? 'test' 肯定包含在 'numerictest' 中。我猜这确切意味着它会搜索一个特定的术语,而不是像 FREETEXT() 那样搜索该术语的术语 + 变形。
CONTAINS(*, ' "test" ')
结果与前两个相同。我会使用 LIKE 进行精确搜索,但这需要很长时间。目前唯一的解决方案是使用CONTAINS(*, ' "test" ')
进行两次搜索,然后再次过滤代码中的结果......不是很漂亮......
精确搜索是什么意思?你的意思是它应该只匹配“测试”吗?如果是这样,那么您可以使用等号运算符(='test')而不是LIKE
(由于模式匹配而速度较慢)。如果您决定使用 contains()
方法,请将其包装在 CTE(公用表表达式)中,然后针对该方法进行查询。
@MariaGustavson 您所看到的不是 CONTAINS 应该工作的方式。如果您搜索“test”,则它不应匹配“numerictest”。所以肯定有问题。您是否配置了自定义分词器?是否有多个全文索引列,其中一个列可能包含“测试”?您是否尝试过重新填充全文索引?
【参考方案1】:
Contains(*,'"test"')
只会按照您的预期匹配“test”的完整单词。
Contains(*,'" test "')
同上
Contains(*,'"*test*"')
实际上会进行 PREFIX ONLY 搜索,基本上去除单词开头的所有特殊字符,并且只使用第二个 *。
您不能使用全文搜索进行 POSTFIX 搜索。
我关心的是 Contains(*) 部分,这将搜索整行中的任何全文目录项。在没有看到数据的情况下很难判断,但我的猜测是,您认为不好的那一行中的另一列实际上与某处的“测试”匹配。
【讨论】:
【参考方案2】:我一直在为一个非常相似的问题绞尽脑汁,最近我找到了解决方案。
就我而言,我正在搜索“@username”的全文字段,但使用CONTAINS(body, "@username")
也只返回“username”。我希望它与 @ 符号严格匹配。
我可以使用LIKE "%@username%"
,但查询时间超过一分钟,这是不可接受的,所以我一直在寻找。
在聊天室中的一些人的帮助下,他们建议同时使用 CONTAINS 和 LIKE。所以:
SELECT TOP 25 * FROM table WHERE
CONTAINS(body, "@username") AND body LIKE "%@username%";
这对我来说非常有效,因为 contains 会同时提取用户名和 @username 记录,然后 LIKE 会过滤掉带有 @ 符号的记录。现在查询需要 2-3 秒。
我知道这是一个老问题,但我在搜索中遇到了它,所以我想我会发布它的答案。我希望这有帮助。
【讨论】:
以上是关于SQL 包含确切的短语的主要内容,如果未能解决你的问题,请参考以下文章