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 包含确切的短语的主要内容,如果未能解决你的问题,请参考以下文章

返回全文搜索中找到的短语的周围文本,SQL 2005

C# Linq的模糊查询(包含精确模糊查询)

过滤一组包含在其他短语中的所有短语的算法

确切的短语在 mongodb 全文搜索中无法正常工作

如何使用 NSPredicate 从数组中选择确切的短语?

替代 sql 游标