使用NOT关键字与全文搜索和多列

时间:2009-08-18 20:06:06

标签: sql sql-server search full-text-search

是否可以在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”列,因为这是一个连续列,将包含所有数据。但是,这会影响相关性排名,似乎不是一个好的解决方案。

1 个答案:

答案 0 :(得分:2)

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

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

现在我要创建一个新列来存储您要搜索的所有行的串联,添加触发器以在插入或更新数据时将所有文本添加到新列,然后只搜索一个新列

这会使你的桌子正常化,但似乎表现得相当好。

相关问题