T-SQL FTS содержит один символ 'n', совпадающий с цифрами - PullRequest
0 голосов
/ 01 июня 2018

Я использую SQL Server 2016 и столкнулся с очень странным поведением.

У меня есть таблица, индексированная для FTS.

При поиске по одному символу, подобному этому ... CONTAINS(N'"a*"') возвращаетвсе записи, содержащие слова, начинающиеся с a - все в порядке.

Но если я ищу по одному символу n , как этот ... CONTAINS(N'"n*"'), он возвращает , а не только записей, содержащихслова, начинающиеся с n, но также содержащие цифры .

Я не могу в Google не упомянуть о таком поведении.Я считаю, что это своего рода подстановочный знак, но в документации ничего об этом нет.

Почему это происходит?Есть ли escape-последовательность или что-то в этом роде?

UPD : тестовая среда

CREATE FULLTEXT CATALOG [ContentCatalog] WITH ACCENT_SENSITIVITY = ON
GO
CREATE TABLE [dbo].[Content]([id] [uniqueidentifier] NOT NULL, [content] [nvarchar](max) NOT NULL,
  CONSTRAINT [PK_Content] PRIMARY KEY CLUSTERED ([id] ASC))
GO
ALTER TABLE [dbo].[Content] ADD CONSTRAINT [DF_Content_id]  DEFAULT (newid()) FOR [id]
GO
INSERT [Content] ([content]) VALUES
    (N'abc def nop'),
    (N'zxc asd qwe'),
    (N'zaq nhy bgt'),
    (N'123 456 789'),
    (N'z12 x34 c56')
GO
CREATE FULLTEXT INDEX ON [Content]([content] LANGUAGE 'English')
KEY INDEX [PK_Content]ON ([ContentCatalog], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)

SELECT * FROM [dbo].[Content]
SELECT FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') -- should be 1
SELECT * FROM [dbo].[Content] WHERE CONTAINS([Content], N'"a*"') -- returns 2 records
SELECT * FROM [dbo].[Content] WHERE CONTAINS([Content], N'"n*"') -- returns extra record with digits only

1 Ответ

0 голосов
/ 01 июня 2018

Это не тот ответ, который, я знаю, противоречит правилам, но я думаю, что он добавляет полезную дополнительную информацию, которую ОП, возможно, пожелает включить в свой вопрос.

Для получения дополнительной информации это, похоже, работаетдо определенного количества n значений в contains.Ниже приведен сценарий в вопросе для построения среды, но используются разные значения теста.select затем объединяет все значения, возвращаемые содержимым, в одну строку для удобства сравнения:

insert [content] ([content]) values
    (N'abc nop abc'),
    (N'abc nno abc'),
    (N'abc nnn abc'),
    (N'abc nnnnbc'),
    (N'abc nnnnnc'),
    (N'1 2 3'),
    (N'10 11 12'),
    (N'100 101 102'),
    (N'1000 1001 1002'),
    (N'10000 10001 10002')
go
          select 'a*' as ContainsSearch,    stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"a*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'n*' as ContainsSearch,    stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"n*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nn*' as ContainsSearch,   stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nn*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nnn*' as ContainsSearch,  stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nnn*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nnnn*' as ContainsSearch, stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nnnn*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nnnnn*' as ContainsSearch,stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nnnnn*"') for xml path('')),1,4,'') as ReturnedValues

Что приводит к:

+----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| ContainsSearch |                                                             ReturnedValues                                                              |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| a*             | abc nop abc || abc nno abc || abc nnn abc || abc nnnnbc || abc nnnnnc                                                                   |
| n*             | abc nop abc || abc nno abc || abc nnn abc || abc nnnnbc || abc nnnnnc || 10 11 12 || 100 101 102 || 1000 1001 1002 || 10000 10001 10002 |
| nn*            | abc nno abc || abc nnn abc || abc nnnnbc || abc nnnnnc || 10 11 12 || 100 101 102 || 1000 1001 1002 || 10000 10001 10002                |
| nnn*           | abc nnn abc || abc nnnnbc || abc nnnnnc                                                                                                 |
| nnnn*          | abc nnnnbc || abc nnnnnc                                                                                                                |
| nnnnn*         | abc nnnnnc                                                                                                                              |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...