我正在尝试使用FORMOF INFLECTIONAL的contains运算符,但我没有得到我认为的预期结果。
这是查询。此查询未返回记录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 Server版本
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)
答案 0 :(得分:1)
我能够通过禁用STOPLIST
解决此问题ALTER FULLTEXT INDEX ON MESSAGE SET STOPLIST = OFF;
现在我得到了预期的结果,在两个查询中包含没有 FORMSOF INFLECTIONAL和CONTAINS FORMSOF INFLECTIONAL。
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.
如果我将停止更改为SYSTEM,则会返回意外结果。
ALTER FULLTEXT INDEX ON MESSAGE SET STOPLIST = SYSTEM;
但我仍然不明白为什么会出现这种情况,以及对此方案进行故障排除并在查询结果和dm_fts_parser
结果之间连接点的正确方法是什么。
参考文献:Answer - MSDN SQL Server Forum - A problem with using full text search with wildcard query