У меня есть некоторые проблемы с индексом 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
Кто-нибудь еще знает, как я могу найти, в каких столбцах полнотекстового индекса находится поисковый запрос?