SQL Server \ 包含屈折短语 \ 未按预期工作的形式



我正在尝试将包含运算符与 FORMOF INFLECTIONAL 一起使用,但我没有得到我认为是预期的结果。

这是查询。此查询不返回记录 ID 1。

SELECT * 
FROM Message
WHERE CONTAINS(*,'FORMSOF(INFLECTIONAL,"01 Hello this is")')

用于重现我的方案的数据库对象。

CREATE DATABASE HelpSo
GO
USE HelpSo
GO
CREATE TABLE Message
(
Id INT NOT NULL IDENTITY(1,1),
Text NVARCHAR(MAX)
CONSTRAINT PK_Message PRIMARY KEY (Id) 
);
GO
CREATE FULLTEXT CATALOG FtcHelpSo AS DEFAULT
GO
CREATE FULLTEXT INDEX ON Message(Text Language 1033  Statistical_Semantics  ) KEY INDEX PK_Message with change_tracking auto
GO

INSERT INTO Message (Text) VALUES ('01 Hello this is a test 20180522.');
INSERT INTO Message (Text) VALUES ('02 Hello this is a test 20180522.');
GO
SELECT * FROM Message;
SELECT * 
FROM Message
WHERE FREETEXT(*,'01 Hello this is a test 20180522.') --Returns 2 records. Expected.
SELECT * 
FROM Message
WHERE CONTAINS(*,'"01 Hello this is a test 20180522."') --Return 1 record. Expected.
SELECT * 
FROM Message
WHERE CONTAINS(*,'FORMSOF(INFLECTIONAL,"01 Hello this")') --Return 1 record. Expected.

-- Here is my problem
SELECT * 
FROM Message
WHERE CONTAINS(*,'FORMSOF(INFLECTIONAL,"01 Hello this is")') --Not Expected Result, I think that should return record Id 1.

我错过了什么?为什么最后一个查询不返回记录 ID 1?

我试图使用以下语句解决此问题,但我无法弄清楚为什么我会得到这个结果。

SELECT * FROM sys.dm_fts_parser ('FORMSOF(INFLECTIONAL,"01 Hello this is")', 1033, 0, 0)
SELECT * 
FROM sys.dm_fts_index_keywords_by_document (DB_ID('HelpSo'), OBJECT_ID('Message'))  
WHERE document_id = 1

SQL Server 中还有其他工具可以帮助我们解决或更好地理解此类问题吗?

SQL 服务器版本

SELECT @@VERSION
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64)   Oct 28 2016 18:17:30   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 17134: ) (Hypervisor) 

我能够通过禁用停止列表来解决此问题

ALTER FULLTEXT INDEX ON MESSAGE SET STOPLIST = OFF;

现在我得到了预期的结果,在两个查询中都包含没有变形形式和包含屈折形式。

SELECT * 
FROM Message
WHERE CONTAINS(*,'"01 Hello this is a test 20180522."') --Return 1 record. Expected.
SELECT * 
FROM Message
WHERE CONTAINS(*,'FORMSOF(INFLECTIONAL,"01 Hello this is")') --Expected Result.

如果我将停止更改为系统,则意外结果又回来了。

ALTER FULLTEXT INDEX ON MESSAGE SET STOPLIST = SYSTEM;

但我仍然不明白为什么会出现这种情况,以及解决这种情况并将查询结果和dm_fts_parser结果之间的点连接起来的正确方法是什么。

参考:答案 - MSDN SQL Server 论坛 - 将全文搜索与通配符查询结合使用的问题

最新更新