2

我正在尝试将包含运算符与 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 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) 
4

1 回答 1

1

我可以通过禁用 STOPLIST 来解决这个问题

ALTER FULLTEXT INDEX ON MESSAGE SET STOPLIST = OFF;

现在我得到了预期的结果,在没有FORMSOF INFLECTIONAL 的 CONTAINS 和 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结果之间的点的正确方法是什么。

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

于 2018-05-23T16:13:11.117 回答