【问题标题】:Contains clause in SQL Server full-text search omits some matching rowsSQL Server 全文搜索中的包含子句省略了一些匹配的行
【发布时间】:2016-01-15 12:24:42
【问题描述】:

我在 SQL Server 2014 数据库中有一个名为 Products 的表。此表中的列ProductName 具有常规的非聚集索引以及全文索引。 当我运行下面的查询时,全文搜索查询会省略 LIKE 子句包含的一些行。

问题:为什么前两个全文查询没有显示 LIKE 查询返回的产品?我的目标是查找名称包含i2 的产品。

SELECT p.ProductId, p.ProductName FROM Products p WHERE contains(p.ProductName, N'i2');
SELECT p.ProductId, p.ProductName FROM Products p WHERE freetext(p.ProductName, N'i2');
SELECT p.ProductId, p.ProductName  FROM Products p WHERE p.ProductName LIKE '%i2%';

我从这些查询中看到的结果如下面的屏幕截图所示。

【问题讨论】:

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


    【解决方案1】:

    这是由于全文搜索的工作方式,它与类似的工作方式不同,因为它不进行简单的模式匹配,它是语言感知的并且实际上是在寻找单词,因此它为什么会找到带有“单词”的行" i2 在其中,但不是例如带有“单词” id21 的那个(id 352)。

    如果你想使用全文搜索,你可以做的是执行前缀搜索,在这里你可以搜索以 i2 开头的单词,如下所示:

    SELECT p.ProductId, p.ProductName FROM Products p WHERE contains(p.ProductName, N'"i2*"');
    

    请注意,您不能在 N'"*i2*"'N'"*i2"' 之类的单词的中间或结尾搜索 i2,因为在这种情况下,星号会作为标准标点符号被忽略,并且不会被视为通配符。

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多