【问题标题】:I dont' understand with “not” in full text search我不明白全文搜索中的“不”
【发布时间】:2015-08-18 20:45:24
【问题描述】:

我不明白为什么我在 SQL Server 2014 中使用全文搜索查询得到这些结果。

以下查询返回的结果在Title 字段中带有“Supervisor”,在HTML_Description 字段中带有“Tokyo”。

SELECT 
    * 
FROM post
    JOIN CONTAINSTABLE([post], (Title, HTML_Description), 'Supervisor AND NOT Tokyo') 
        AS tb1 ON tb1.[Key] = post.ID

如果我像这样删除CONTAINSTABLE 中的HTML_Description 字段:

SELECT 
    * 
FROM post 
    JOIN CONTAINSTABLE(post, (Title), 'Supervisor AND NOT Tokyo') 
        AS tb1 ON tb1.[Key] = post.ID

结果是一样的。

如果我像这样只使用CONTAINSTABLE 中的HTML_Description 字段:

SELECT 
    * 
FROM post 
    JOIN CONTAINSTABLE(post, (HTML_Description), 'Supervisor AND NOT Tokyo') 
        AS tb1 ON tb1.[Key] = post.ID

没有任何结果。

如何将NOT 运算符应用于所有字段?

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    为什么会发生这种情况?因为即使跨多个列进行搜索,也必须在单个列中满足全文搜索条件。因此,您的查询相当于:

    SELECT 
        * 
    FROM post
        JOIN CONTAINSTABLE([post], (Title), 'Supervisor AND NOT Tokyo') 
            AS tb1 ON tb1.[Key] = post.ID
    UNION ALL
    SELECT 
        * 
    FROM post
        JOIN CONTAINSTABLE([post], (HTML_Description), 'Supervisor AND NOT Tokyo') 
            AS tb1 ON tb1.[Key] = post.ID
    

    解决方法:

    您应该将TitleHTML_Description 合并到一个列中(您甚至可以创建一个计算列来执行此操作)并在此列上创建全文索引。

    值得一提:在大多数情况下,您可以使用 2 个或更多 CONTAINSTABLECONTAINS 语句来重写查询,以单独搜索每个关键字 -- CONTAINS(*, 'apples') and CONTAINS(*, 'oranges') 而不是 CONTAINS(*, 'apples AND oranges') -- 但你会得到多个无意义的Rank 列(因为每个列都是针对单个关键字计算的),否则您根本不会得到Rank(如果您使用CONTAINS)。下面的链接显示了一个简单的例子。但是,这不适用于您的情况,因为您使用了 NOT。您不能仅使用 NOT 条件执行全文搜索——CONTAINS(*, 'NOT Tokyo') 将引发错误。

    Full-Text Search Queries with CONTAINS Clause Search Across Columns

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 2010-10-02
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2021-05-13
      相关资源
      最近更新 更多