SQL Server \ CONTAINS FORMSOF INFLECTIONAL短语\没有按预期工作

时间:2018-05-22 23:03:23

标签: sql-server full-text-search sql-server-2017 inflection

我正在尝试使用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) 

1 个答案:

答案 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