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 树,根据数据的开始,很容易“跳转”或“寻找”到索引的不同部分索引列。