是否可以在SQL Server全文搜索中使用CONTAINSTABLE和NOT关键字,并排除单个列包含要排除的值的行?
例如,让我们采用以下索引视图(为简化此问题而简化):
ItemId INT
FirstName VARCHAR(200)
MiddleName VARCHAR(200)
LastName VARCHAR(200)
Address VARCHAR(1000)
ChildrenNames TEXT
SearchData TEXT
SearchData是从其他text / varchar字段生成的连接字段。
然后可以使用以下查询搜索此视图,以查找包含 firstname 但不包含 lastname 的行:
SELECT *
FROM [v_MyView] V
LEFT OUTER JOIN CONTAINSTABLE
(
[v_MyView],
(
[FirstName],
[MiddleName],
[LastName],
[Address],
[ChildrenName],
[SearchData]
), '"name" AND NOT "lastname"') FTS ON [FTS].[Key] = [V].[ItemId]
WHERE (ISNULL(RANK,0) > 0)
此查询似乎没有返回正确的结果,因为如果搜索的字段的所有符合条件,它只会排除行,而它应排除 ANY 符合条件的行。
即。在任何(单个)列中包含 name AND lastname 的行应从结果集中排除,而不是仅包含的行每个列中的名称和姓氏(这不太可能)。
唯一可用的选项似乎是检查用户查询是否包含任何排除值(例如name -lastname),如果是,则将查询限制为仅搜索“SearchData”列,因为这是一个连续列,将包含所有数据。但是,这会影响相关性排名,似乎不是一个好的解决方案。
答案 0 :(得分:2)
我遇到了同样的问题,我怀疑这是SQL服务器中的一个错误。
我怀疑有人忘了!(A& B& C)===!A | !B | !ç
现在我要创建一个新列来存储您要搜索的所有行的串联,添加触发器以在插入或更新数据时将所有文本添加到新列,然后只搜索一个新列
这会使你的桌子正常化,但似乎表现得相当好。