MS SQL - FULLTEXT INDEX - Какой столбец - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть некоторые проблемы с индексом FULLTEXT на MS SQL Server.Ниже я создал простое решение (пожалуйста, не обращайте внимания на очевидные проблемы проектирования данных).Я начал использовать полнотекстовый индекс в своей базе данных, и это имеет много преимуществ по сравнению с использованием LIKE с подстановочными знаками, особенно с точки зрения скорости для очень больших таблиц с несколькими столбцами для поиска.

create fulltext catalog FullTextCatalog as default
select * from sys.fulltext_catalogs
GO

IF OBJECT_ID('dbo.Books') IS NOT NULL
    DROP TABLE  dbo.Books
GO

CREATE TABLE dbo.Books
(
BookID          INT IDENTITY(1,1),
BookTitle       NVARCHAR(255),
BookDescription NVARCHAR(1000),
BookCategory    NVARCHAR(255),
CONSTRAINT [PK_Books] PRIMARY KEY CLUSTERED
(
BookID ASC
)
)
GO

INSERT INTO dbo.Books (BookTitle, BookDescription, BookCategory)
VALUES
('Book1', 'This is the first book in the series', 'Sport'),
('Book2', 'This is the second book in the series', 'Sport'),
('Book3', 'This is the third sport book in the series', 'Sport'),
('Book4', 'This is the NEW book in the series about nature', 'Nature')
GO

CREATE FULLTEXT INDEX ON dbo.Books
(
BookTitle       LANGUAGE 'Neutral',
BookDescription LANGUAGE 'Neutral',
BookCategory    LANGUAGE 'Neutral'
)
KEY INDEX [PK_Books] ON ([FullTextCatalog], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM);
GO

WAITFOR DELAY '00:00:03'

SELECT *
FROM dbo.Books
WHERE FREETEXT((BookTitle, BookDescription, BookCategory), 'sport')

Один из моихнеобходимо знать, в каком столбце была найдена моя строка поиска. Поэтому, используя приведенную выше таблицу, мне нужно знать, что поисковый термин 'sport' был найден в столбцах BookDescription и BookCategory для записи 3 и только BookCategory для записей 1 и 2. Кодниже я разработал поиск по индексу, и хотя это почти соответствует моей цели, у него много проблем.Особенно тот факт, что мне нужно искать в индексе, используя LIKE и подстановочные знаки, в первую очередь побеждает мой объект, используя полнотекстовый индекс.Кроме того, LIKE будет возвращать разные результаты, если я ищу неполные слова (порт) по сравнению с FREETEXT.

SELECT  kw.*, c.name
FROM    sys.dm_fts_index_keywords_by_document(DB_ID(), OBJECT_ID('dbo.Books')) kw
JOIN    sys.all_columns c
ON      kw.column_id = c.column_id
WHERE   display_term like '%sport%'
AND     c.object_id = OBJECT_ID('dbo.Books')
ORDER BY kw.document_id, c.column_id

Кто-нибудь еще знает, как я могу найти, в каких столбцах полнотекстового индекса находится поисковый запрос?

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