全文搜索仅执行“以”开头的搜索

Phi*_*hil 8 sql-server full-text-search

非常基本的问题,但我怎样才能让containstable搜索进行实际的“包含”搜索,而不是“以”开头?

例如,来自文档中的示例

CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));  
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);  
INSERT Flags VALUES ('France', 'Blue and White and Red');  
INSERT Flags VALUES ('Italy', 'Green and White and Red');  
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');  
SELECT * FROM Flags;  
GO  

CREATE FULLTEXT CATALOG TestFTCat;  
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;  
GO   

SELECT * FROM Flags;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green') ORDER BY RANK DESC;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC;  
Run Code Online (Sandbox Code Playgroud)

工作正常,也是如此:

SELECT * FROM CONTAINSTABLE (Flags, FlagColors, '"Gree*"') ORDER BY RANK DESC;  
Run Code Online (Sandbox Code Playgroud)

但这不会:

SELECT * FROM CONTAINSTABLE (Flags, FlagColors, '"*reen"') ORDER BY RANK DESC;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, '"*reen*"') ORDER BY RANK DESC;
Run Code Online (Sandbox Code Playgroud)

我应该使用不同的查询,还是我正在寻找的东西是不可能的?

Jos*_*ell 13

我认为,在 SQL Server 中进行全文搜索时,这是一个常见的误解。

全文搜索可以搜索整个单词以及许多其他内容。从CONTAINS文档

CONTAINS 可以搜索:

  • 一个词或词组。

  • 单词或短语的前缀。

  • 一个词接近另一个词。

  • 从另一个词屈折地产生的词(例如,词drive 是drives、driven、driven 和driven 的屈折词干)。

  • 一个词与使用同义词词典的另一个词同义(例如,“metal”一词可以有“aluminum”和“steel”等同义词)。

因此,就像文本字符串上的普通索引一样,您可以进行前缀搜索。

无论是全文搜索还是普通的 SQL Server 索引,都不支持单词或文本字符串中进行“后缀”或“包含”搜索。所以基本上没有领先的通配符。

请注意,同样的限制适用于CONTAINSTABLE

CONTAINSTABLE 可用于与 CONTAINS 谓词相同类型的匹配,并使用与 CONTAINS 相同的搜索条件。

我想这些限制的存在是因为索引在 SQL Server 中的逻辑存储方式 - 作为 b 树,根据数据的开始,很容易“跳转”或“寻找”到索引的不同部分索引列。