Лучшее решение - использовать ContainsTable. Используйте объединение, чтобы создать запрос, который ищет все 3 столбца и добавляет целое число, используемое для указания того, какой столбец был найден. Сортируйте результаты по этому целому числу и затем ранжируйте desc.
Ранг является внутренним для сервера sql и не может быть изменен.
Вы также можете манипулировать рангом , возвращенным , поделив ранг на целое число (имя будет разделено на 1, ключевое слово и местоположение на 2 или выше). Это вызвало бы появление разных рейтингов.
Вот несколько примеров sql
:
- Рекомендовать использовать отслеживание изменений начала и запускать фоновое обновление индекса (см. Книги в Интернете)
SELECT 1 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table
INNER JOIN ContainsTable(Restaurant, Name, 'chilly chicken') AS Key_Table ON
FT_Table.RestaurantId = Key_Table.[Key]
UNION SELECT 2 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table
INNER JOIN ContainsTable(Restaurant, Keywords, 'chilly chicken') AS Key_Table ON
FT_Table.RestaurantId = Key_Table.[Key]
UNION SELECT 3 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM Restaurants AS FT_Table
INNER JOIN ContainsTable(Restaurant, Location, 'chilly chicken') AS Key_Table ON
FT_Table.RestaurantId = Key_Table.[Key]
ORDER BY ColumnLocation, Rank DESC
В производственной среде я бы вставил выходные данные запроса в табличную переменную для выполнения каких-либо дополнительных манипуляций перед возвратом результатов (в этом случае может не потребоваться). Кроме того, избегайте использования *, просто перечислите столбцы, которые вам действительно нужны.
Редактировать: Вы правы в использовании ContainsTable, вам нужно изменить ключевые слова на «chilly *» И «курица *», я делаю это с помощью процесса, который токенизирует входную фразу. Если вы не хотите этого делать, просто замените каждый вышеупомянутый экземпляр ContainsTable на FreeTextTable, запрос все равно будет работать так же.