SQL Server ContainsTable не возвращает результат со словом, начинающимся с «N» - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу сделать запрос, чтобы получить людей с синтаксисом NEAR.Когда я ищу любой текст, который содержит букву N во втором слове, результат всегда пуст.

У меня на столе зарегистрированы два человека, Рикардо Мова и Рикардо Нова.Если поиск 'Ricardo NEAR' Mova * "'в порядке, но не для' Ricardo NEAR 'Nova *'

EDIT

  • 4 записи (РикардоNova, Ricardo Novais, Ricardo Novo, Ricardo Nunes)
  • запрос 'Ricardo NEAR' N * '
  • результат показывает только "Ricardo Novais" и "Ricardo Nunes".

Таблица:

CREATE TABLE [dbo].[EntitySearch](
    [IdEntity] [int] NOT NULL,
    [Name] [nvarchar](max) NULL,
    [Accessibility] [bit] NOT NULL,
    [Document] [nvarchar](max) NULL,
    [Email] [nvarchar](max) NULL,
    [Phone] [nvarchar](max) NULL,
    [Phone2] [nvarchar](max) NULL,
    [Birthdate] [datetime] NULL,
    [Gender] [int] NULL,
    [IsAct] [bit] NOT NULL,
    [Discriminator] [int] NOT NULL,
 CONSTRAINT [PK_dbo.EntitySearch] PRIMARY KEY CLUSTERED 
(
    [IdEntity] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =     OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Каталог

CREATE FULLTEXT CATALOG main_catalog;

Полный индекс

CREATE FULLTEXT INDEX ON dbo.EntitySearch 
        (       [Name] 
            Language[Brazilian],  
                [Document]
            Language[Brazilian],
                [Email]
            Language[Brazilian], 
                [Phone]
            Language[Brazilian],
                [Phone2]
            Language[Brazilian] )  
KEY INDEX [PK_dbo.EntitySearch] ON main_catalog;

Запрос:

SELECT top 10
    FT_TBL.[IdEntity]
    ,FT_TBL.[Name]
    ,FT_TBL.[Accessibility]
    ,FT_TBL.[Document]
    ,FT_TBL.[Email]
    ,FT_TBL.[Phone]
    ,FT_TBL.[Phone2]
    ,FT_TBL.[Birthdate]
    ,FT_TBL.[Gender]
    ,FT_TBL.[IsAct]
    ,FT_TBL.[Discriminator]
    FROM [EntitySearch] AS FT_TBL INNER JOIN  
    CONTAINSTABLE ([EntitySearch], [Name], 'Ricardo NEAR "Nova*"' ) AS KEY_TBL  
    ON FT_TBL.[IdEntity] = KEY_TBL.[KEY]  
    WHERE
        FT_TBL.[IsAct] = 1 
    and FT_TBL.[Discriminator] = 2
    and KEY_TBL.RANK > 10  
    ORDER BY KEY_TBL.RANK DESC, FT_TBL.[Name] 

Я ожидаю, что покажет 1 запись, но ни одна не будет показана.Спасибо!

РЕДАКТИРОВАТЬ: ВРЕМЕННОЕ РЕШЕНИЕ

Я удалил и заново создал полнотекстовый индекс на португальском языке.Проблема исчезла, поэтому я думаю, что «ошибка» на бразильском языке для индекса.

1 Ответ

0 голосов
/ 11 февраля 2019

Это не ошибка.

У каждого языка есть свой список стоп-слов, что означает, что некоторые слова не имеют значения для поиска по индексу.

https://docs.microsoft.com/en-us/sql/relational-databases/search/configure-and-manage-stopwords-and-stoplists-for-full-text-search?view=sql-server-2017

SELECT * 
FROM sys.fulltext_system_stopwords 
WHERE language_id = 1046 --Brazilian language ID

Итак, в моем случае я применил алгоритм, который исправляет поисковый запрос перед отправкой.

...