【问题标题】:AND statement for multiple columns in fulltext index全文索引中多列的 AND 语句
【发布时间】:2010-02-11 13:26:20
【问题描述】:

我有一个全文索引表并尝试查询匹配多个单词的结果。例如。我有一个带有索引列address_textzip_codecity 的地址表。

| ROW | address_text   | zip_code | city       |  
| 1   | Bourbon street | 1234     | Baltimore  |  
| 2   | Bourbon street | 1234     | New Orleans|

现在我想搜索“Bourbon Baltimore”并且只想要第一行。

我尝试了以下方法:

SELECT FT_TBL.* FROM ADDRESSES AS FT_TBL 
INNER JOIN CONTAINSTABLE(ADDRESSES, *, '"Bourbon*" AND "Baltimore*"') AS KEY_TBL 
ON FT_TBL.address_id = KEY_TBL.[KEY] 
ORDER BY KEY_TBL.RANK, address_text

但它根本不会返回任何行。

【问题讨论】:

    标签: sql indexing full-text-search containstable


    【解决方案1】:

    我发现这是一个有趣的问题,所以我决定去阅读“CONTAINSTABLE”。所以,我看到它是一个 Transact SQL 函数。如果我正确阅读了文档,它看起来像 contains_search_condition(即,'"Bourbon*" AND "Baltimore*"')分别应用于每一列。因此,您可能需要将两个 CONTAINSTABLE 函数连接在一起以获得所需的效果。

    每个 CONTAINSTABLE 都需要指定一个搜索条件,除非您想在每个列中搜索每个条件。在这种情况下,AND 需要成为 OR。

    【讨论】:

      【解决方案2】:

      在我看来,FREETEXT 命令可能是您最简单的选择,如果需要,可能与 CONTAINSTABLE 结合使用。

      SELECT *
      FROM ADDRESSES
      WHERE FREETEXT (*, 'Bourbon Baltimore' ) --no wildcards possible
      

      【讨论】:

        【解决方案3】:

        我可能为时已晚,但我也有同样的问题。我带来的蹩脚和丑陋的解决方案如下。

        在表上定义一个索引视图,其中一列是主键,第二列是所有其他感兴趣的列的串联,然后是视图上的全文索引。使用相同的语法“term1”和“term2”在视图上进行搜索

        所以在这种情况下是

        CREATE VIEW vFoo
        WITH SCHEMABINDING
        AS 
        SELECT ROW, ISNULL(address_text,'') + ' ' 
        + ISNULL(cast(zip_code as varchar(xx)),'') + '' as SearchText
         FROM addresses
        
        CREATE UNIQUE CLUSTERED INDEX uci_bar ON vFoo 
        (
            Row ASC
        )
        

        然后是视图上的全文索引

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-17
          • 1970-01-01
          • 1970-01-01
          • 2021-04-02
          相关资源
          最近更新 更多