SQL 服务器全文搜索中的 Contains 子句省略了一些匹配行
Contains clause in SQL Server full-text search omits some matching rows
我在 SQL Server 2014 数据库中有一个名为 Products
的 table。此 table 中的列 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%';
我从这些查询中看到的结果如下面的屏幕截图所示。
这是由于全文搜索的工作方式,它与类似的工作方式不同,因为它不进行简单的模式匹配它是语言感知的并且实际上是在寻找单词,因此它找到带有"word" i2 在其中,但不是带有 "word" id21 的那个(id 352)。
如果您想使用全文搜索,您可以执行前缀搜索,您可以在其中搜索以 i2 开头的单词,如下所示:
SELECT p.ProductId, p.ProductName FROM Products p WHERE contains(p.ProductName, N'"i2*"');
请注意,您不能在 N'"*i2*"'
或 N'"*i2"'
等单词的中间或结尾搜索 i2,因为在这种情况下,星号会被忽略为标准标点符号,并且不会被视为通配符.
我在 SQL Server 2014 数据库中有一个名为 Products
的 table。此 table 中的列 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%';
我从这些查询中看到的结果如下面的屏幕截图所示。
这是由于全文搜索的工作方式,它与类似的工作方式不同,因为它不进行简单的模式匹配它是语言感知的并且实际上是在寻找单词,因此它找到带有"word" i2 在其中,但不是带有 "word" id21 的那个(id 352)。
如果您想使用全文搜索,您可以执行前缀搜索,您可以在其中搜索以 i2 开头的单词,如下所示:
SELECT p.ProductId, p.ProductName FROM Products p WHERE contains(p.ProductName, N'"i2*"');
请注意,您不能在 N'"*i2*"'
或 N'"*i2"'
等单词的中间或结尾搜索 i2,因为在这种情况下,星号会被忽略为标准标点符号,并且不会被视为通配符.