2009-08-18 93 views
2

是否可以将CONTAINSTABLE和NOT关键字用于SQL Server全文搜索并排除单列包含要排除的值的行?在全文搜索和多列中使用NOT关键字

例如,让我们采取以下索引视图(简化的用于说明此问题的目的):

ItemId INT 
FirstName VARCHAR(200) 
MiddleName VARCHAR(200) 
LastName VARCHAR(200) 
Address VARCHAR(1000) 
ChildrenNames TEXT 
SearchData TEXT 

SearchData不同于其它文本/ VARCHAR字段生成级联字段。

这种看法,然后可以使用下面的查询查找包含行进行搜索,但没有姓氏:该查询似乎

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 -lastname),如果是,则限制查询仅搜索'SearchData'列,因为这是一个连接列并将包含所有数据。但是,这会影响相关性排名,似乎并不是一个好的解决方案。

回答

2

我遇到了同样的问题,我怀疑这是SQL服务器中的一个错误。

我怀疑有人忘了!(A & B & C)===!A | !B | !C

现在,我将创建一个新列以存储要搜索的所有行的连接,添加触发器以在插入或更新数据时将所有文本添加到新列中,然后搜索一个新的专栏。

这使你的桌子正常化,但似乎瓶坯合理地好。

相关问题