Ключом к манипулированию ранжированием является использование союза. Для каждого столбца вы используете отдельный оператор выбора. В этом операторе добавьте идентификатор, который показывает, из какого столбца была извлечена каждая строка. Вставьте результаты в табличную переменную, затем вы можете управлять ранжированием, сортируя по идентификатору или умножая ранг на какое-то значение на основе идентификатора.
Ключ в том, чтобы создать видимость изменения рейтинга, а не изменить рейтинг сервера SQL.
Пример использования табличной переменной:
DECLARE @Results TABLE (PersonId Int, Rank Int, Source Int)
Для таблицы Люди с столбцами PersonId Int PK Identity, FirstName VarChar(100), MiddleName VarChar(100), LastName VarChar(100), AlsoKnown VarChar(100)
с каждым столбцом, добавленным в полнотекстовый каталог, можно использовать запрос:
INSERT INTO @Results (PersonId, Rank, Source)
SELECT PersonId, Rank, 1
FROM ContainsTable(People, FirstName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 2
FROM ContainsTable(People, MiddleName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 3
FROM ContainsTable(People, LastName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 4
FROM ContainsTable(People, AlsoKnown, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
/*
Now that the results from above are in the @Results table, you can manipulate the
rankings in one of several ways, the simplest is to pull the results ordered first by Source then by Rank. Of course you would probably join to the People table to pull the name fields.
*/
SELECT PersonId
FROM @Results
ORDER BY Source, Rank DESC
/*
A more complex manipulation would use a statement to multiply the ranking by a value above 1 (to increase rank) or less than 1 (to lower rank), then return results based on the new rank. This provides more fine tuning, since I could make first name 10% higher and middle name 15% lower and leave last name and also known the original value.
*/
SELECT PersonId, CASE Source WHEN 1 THEN Rank * 1.1 WHEN 2 THEN Rank * .9 ELSE Rank END AS NewRank FROM @Results
ORDER BY NewRank DESC
Единственным недостатком является то, что вы заметите, что я не использовал UNION ALL
, поэтому, если слово появляется в более чем одном столбце, рейтинг не будет отражать это. Если это проблема, вы можете использовать UNION ALL
, а затем удалить дубликаты идентификаторов лиц, добавив все или часть рейтинга дубликатов к рангу другой записи с таким же идентификатором лица.