SQL Server全文搜索NOT运算符

3

我想使用NOT运算符搜索我的全文索引。

SELECT * FROM CONTAINSTABLE(MY_TABLE, *, 'NOT name'),

以下是异常情况:
Msg 7630, Level 15, State 3, Line 1
Syntax error near 'name' in the full-text search condition 'NOT name'.

什么是问题?我如何使用 只有 NOT 运算符来搜索我的全文索引?

谢谢。

2个回答

3

我尝试以下查询:SELECT * FROM MY_TABLE WHERE NOT CONTAINS(*, 'NOT name')相同的异常。 - selami
你不必在括号内加上 NOT,否则你可以按照我帖子中提到的方法处理。 - NG.
3
没问题,但我有一个带有全文查询参数的存储过程。SELECT * FROM CONTAINSTABLE (MY_TABLE,*,@QUERY) 所以,我必须使用CONTAINSTABLE。谢谢帮助。 - selami
您可以在存储过程中使用简单的CONTAINS,该过程使用变量谓词,因此您不必强制使用CONTAINSTABLE。唯一的限制是需要具有排名信息,但在您的情况下,这将没有意义(我猜当您仅使用NOT运算符时,所有匹配记录将具有相同的排名 - 如果可能的话)。 - Ishikawa

1
我是一个全文搜索的新手,但根据文档

NOT只能出现在AND之后,例如AND NOT。OR NOT操作符不被允许。NOT不能在第一个术语之前指定

所以在你的情况下,CONTAINSTABLE(MY_TABLE, *, 'NOT name')被认为是无效的。 我发现使用NOT运算符与CONTAINSTABLE的唯一方法如下:

SELECT * 
FROM CONTAINSTABLE({table_name}, *, N'{another_condition} AND NOT name')

当你不需要RANK信息时,@NG提交的语法可以正常工作,但是一旦你需要它,似乎你需要在NOT运算符之前添加另一个(虚拟)条件(如果可以避免,请不要使用虚拟条件,这会非常混乱...)。

注意:在我看来,在CONTAINSTABLE中仅有一个NOT运算符的概念并没有真正意义,当你的参数是有排名结果时。实际上,如果允许这样做,所有匹配的结果将共享相同的排名值(因为它们不包含被排除的标记)。RANK将成为无关紧要的信息,可以使用简单的CONTAINS代替CONTAINSTABLE(参见@ NG的答案)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接