我尝试使用" CONTAINS()"来实现搜索机制。在SQL Server 2014上。
我已经在这里阅读https://technet.microsoft.com/en-us/library/ms142538%28v=sql.105%29.aspx和#34; SQL Server 2008中的专业全文搜索"我需要使用双引号来搜索确切的短语。
但是e.q.如果我使用此CONTAINS(*, '"test"')
,我会收到包含" numerictest"等字词的结果也。如果我尝试CONTAINS(*, '" test "')
,它就是一样的。我注意到,结果较少,好像我会用CONTAINS(*, '*test*')
搜索前缀,sufix搜索,所以搜索之间肯定有一个增量。
我没想到" numerictest"在第一个声明中。这种行为有解释吗?
答案 0 :(得分:2)
我一直在讨论一个非常类似的问题,我最近找到了解决方案。
就我而言,我正在搜索" @ username"的全文字段。但使用CONTAINS(body, "@username")
只返回"用户名"同样。我希望它与@符号严格匹配。
我可以使用LIKE "%@username%"
,但查询过了一分钟是不可接受的,所以我一直在寻找。
在聊天室的一些人的帮助下,他们建议使用CONTAINS和LIKE。所以:
SELECT TOP 25 * FROM table WHERE
CONTAINS(body, "@username") AND body LIKE "%@username%";
这对我来说非常合适,因为contains包含了username和@username记录,然后LIKE过滤掉带有@符号的记录。查询现在需要2-3秒。
我知道这是一个古老的问题,但我在搜索中遇到了它,所以得到了我认为我会发布它的答案。我希望这有帮助。
答案 1 :(得分:1)
Contains(*,'"test"')
只能匹配“test”的完整字词。
Contains(*,'" test "')
与上述相同
Contains(*,'"*test*"')
实际上会进行PREFIX ONLY搜索,基本上会删除单词开头的任何特殊字符,并且只使用第二个*。
您无法使用全文搜索进行POSTFIX搜索。
我关注的是Contains(*)部分,这将搜索整行中的任何全文编目项。在没有看到数据的情况下很难说,但我的猜测是,你认为那行中的另一列实际上是匹配“某个地方的”测试“。