SQL полнотекстовый поиск - положение слова в поле
У меня есть таблица ключевых слов в поле SQL Server, которые в настоящее время хранятся с полнотекстовым индексом. Меня попросили добавить в наши поиски средство, которое расставляет приоритеты для результатов, где результат ближе к началу столбца.
CREATE TABLE [dbo].[ftsTest]
(
[ID] [INT] NOT NULL,
[Keywords] [NVARCHAR](MAX) NOT NULL,
CONSTRAINT [PK_ftsTest]
PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
INSERT INTO [dbo].[ftsTest]
VALUES (1, N'Test Two Three Four Five Six Seven Eight Nine Ten'),
(2, N'One Test Three Four Five Six Seven Eight Nine Ten'),
(3, N'One Two Test Four Five Six Seven Eight Nine Ten'),
(4, N'One Two Three Test Five Six Seven Eight Nine Ten'),
(5, N'One Two Three Four Test Six Seven Eight Nine Ten'),
(6, N'One Two Three Four Five Test Seven Eight Nine Ten'),
(7, N'One Two Three Four Five Six Test Eight Nine Ten'),
(8, N'One Two Three Four Five Six Seven Test Nine Ten'),
(9, N'One Two Three Four Five Six Seven Eight Test Ten'),
(10, N'One Two Three Four Five Six Seven Eight Nine Test ')
После настройки общего полнотекстового поиска для этого я могу сгенерировать список результатов с помощью:
SELECT *
FROM ftsTest
WHERE CONTAINS (Keywords, 'test')
SELECT *
FROM CONTAINSTABLE(ftsTest, Keywords, 'test')
Contains
Запрос возвращает ожидаемые результаты, однако не имеет приоритета. ContainsTable
запрос возвращает ранг, но ему присваивается одинаковое значение.
Я понимаю, что ранг учитывает вхождение (смещение слова в документ), но я не знаю, как получить доступ к этим данным. Вероятно, это ошибка RTFM с моей стороны, но я не понимаю, как повлиять на ранг, чтобы удовлетворить требования клиентов.
Я смотрю на https://technet.microsoft.com/en-us/library/ms142524(v=sql.105).aspx но я все еще немного в темноте.
В настоящий момент я работаю над несколькими версиями SQL Server (с 2008 R2 по 2016 год), но, похоже, мы обновим все до 2016 года в будущем.
Любая помощь с благодарностью получена.
Большое спасибо.
Возможное решение:
FTS имеет возможность ранжирования по тому, насколько близки слова. Добавляя контрольное слово в начало поля, я могу затем вычислить расстояние от этого слова, чтобы дать мне рейтинг.
UPDATE ftsTest
SET keywords = '_start_ ' + keywords
SELECT *
FROM CONTAINSTABLE(ftsTest, Keywords, 'NEAR((_start_,test))')
Это делает то, что я ищу, но пока не собираюсь отмечать это как ответ, если у кого-то есть что-то лучше. Не кажется самым изящным из решений, и это добавляет к размеру полнотекстового индекса.