SQL Server \ СОДЕРЖИТ ФОРМУЛЬНУЮ ИНФЛЕКЦИОННУЮ фразу \ Не работает должным образом - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь использовать оператор содержимого с FORMOF INFLECTIONAL, но я не получаю ожидаемого результата.

Вот запрос.Этот запрос не возвращает идентификатор записи 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.

Чего мне не хватает?Почему последний запрос не возвращает идентификатор записи 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 голосов
/ 23 мая 2018

Мне удалось обойти эту проблему, отключив STOPLIST

ALTER FULLTEXT INDEX ON MESSAGE SET STOPLIST = OFF;

Теперь я получаю ожидаемый результат, в обоих запросах содержится без FORMSOF INFLECTIONAL и содержит 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 Forum - Проблема с использованием полнотекстового поиска с подстановочным запросом

...