CONTAINS () возвращает ложные срабатывания в индексированном столбце FullText - PullRequest
0 голосов
/ 17 апреля 2020

Я использую SQL Сервер 2019 (RTM-GDR) (KB4517790) - 15.0.2070.41 (X64).

Я запрашиваю данные через SSMS 15.0.18330.0.

I иметь таблицу, содержащую 10 094 641 строку, которая определяется следующим образом:

- создать таблицу

CREATE TABLE dbo.TableName (
  RowID                         bigint NOT NULL identity (1,1)
, RowSyntax                     varchar(max)
, hasLanguageReference          int DEFAULT 0
, CONSTRAINT PK_TableName_RowID PRIMARY KEY CLUSTERED (RowID)
)

--create fulltext catalog and index

IF NOT EXISTS (
            SELECT 1
            FROM sys.fulltext_catalogs
            WHERE [name] = 'TableName_ftc'
            )
CREATE FULLTEXT CATALOG TableName_ftc AS DEFAULT; 
CREATE FULLTEXT INDEX ON dbo.TableName (RowSyntax Language 1033) KEY INDEX PK_MyTable_RowID

--insert test row

INSERT INTO dbo.TableName (RowSyntax)
VALUES ('in v3 it would be set to 128000 (bits/second)')

--look for a string in the RowSyntax

SELECT RowID, RowSyntax
from dbo.TableName
WHERE CONTAINS(RowSyntax, 'Set-')

результат запроса

| RowId | RowSyntax
| 1 | in v3 it would be set to 128000 (bits/second)

Эта тестовая строка, однако, НЕ содержит строку поиска 'Set -' (с да sh).

Почему CONTAINS () возвращает ложное срабатывание? Это раздевает определенных персонажей? CONTAINS () не может обрабатывать пробелы и некоторые специальные символы, такие как знак #, но не выдает ошибку для символов поиска, таких как тире или точки; он просто полностью их игнорирует?

В гораздо меньшей таблице LIKE '%Set-%' будет работать, но не в таблице с большими столбцами varchar (), с 10M строками и ростом.

Мой самый большой LEN(RowSyntax) значение составляет 13 757 798. Разделение больших строк на несколько столбцов не вариант.

Q1: CONTAINS () работает как задумано? Сценарий, приведенный выше, является особенностью? : -)

Q2: Какие есть другие альтернативы для поиска строк больших символов в SQL Server? Желательно что-то, что может обрабатывать оба пробела и любой специальный символ, который кто-то бросает в него.

Не могли бы вы посоветовать? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...