Подтвердить что ты не робот

Полный текстовый поиск SQL Server - взвешивание определенных столбцов над другими

Если у меня есть следующий текстовый поисковый запрос:

SELECT *
FROM dbo.Product
   INNER JOIN CONTAINSTABLE(Product, (Name, Description, ProductType), 'model') ct
      ON ct.[Key] = Product.ProductID

Можно ли взвешивать просматриваемые столбцы?

Например, мне больше нравится модель слова, появляющаяся в столбце Name, чем я Описание или ProductType.

Конечно, если слово находится во всех трех столбцах, я бы ожидал, что он будет ранга выше, чем если бы он был только в столбце имени. Есть ли способ иметь ранжирование строк выше, если он просто появляется в имени, а не только в описании/ProductType?

4b9b3361

Ответ 1

Вы можете сделать что-то вроде следующего запроса. Здесь WeightedRank вычисляется путем умножения ранга отдельных совпадений. ПРИМЕЧАНИЕ. К сожалению, у меня нет установленного Northwind, поэтому я не мог проверить это, поэтому посмотрите на него скорее как псевдокод и дайте мне знать, если он не работает.

declare @searchTerm varchar(50) = 'model';

 SELECT 100 * coalesce(ct1.RANK, 0) +
        10 * coalesce(ct2.RANK, 0) +
        1 * coalesce(ct3.RANK, 0) as WeightedRank,
        *
   FROM dbo.Product
            LEFT JOIN
        CONTAINSTABLE(Product, Name, @searchTerm) ct1 ON ct.[Key] = Product.ProductID
            LEFT JOIN
        CONTAINSTABLE(Product, Description, @searchTerm) ct2 ON ct.[Key] = Product.ProductID
            LEFT JOIN
        CONTAINSTABLE(Product, ProductType, @searchTerm) ct3 ON ct.[Key] = Product.ProductID

Ответ 2

Листинг 3-25. Пример поиска столбца-умножителя столбца Полнотекстовый поиск Pro в SQL Server 2008

SELECT *
FROM (
    SELECT Commentary_ID
        ,SUM([Rank]) AS Rank
    FROM (
        SELECT bc.Commentary_ID
            ,c.[RANK] * 10 AS [Rank]
        FROM FREETEXTTABLE(dbo.Contributor_Birth_Place, *, N'England') c
        INNER JOIN dbo.Contributor_Book cb ON c.[KEY] = cb.Contributor_ID
        INNER JOIN dbo.Book_Commentary bc ON cb.Book_ID = bc.Book_ID

        UNION ALL

        SELECT c.[KEY]
            ,c.[RANK] * 5
        FROM FREETEXTTABLE(dbo.Commentary, Commentary, N'England') c

        UNION ALL

        SELECT ac.[KEY]
            ,ac.[RANK]
        FROM FREETEXTTABLE(dbo.Commentary, Article_Content, N'England') ac
        ) s
    GROUP BY Commentary_ID
    ) s1
INNER JOIN dbo.Commentary c1 ON c1.Commentary_ID = s1.Commentary_ID
ORDER BY [Rank] DESC;