2011-07-06 10 views
12

Si tengo el siguiente texto completo de consulta de búsqueda:texto de SQL Server Buscar - Ponderación de ciertas columnas sobre los demás

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

¿Es posible que sopesar las columnas que están siendo buscadas?

Por ejemplo, me preocupa más la palabra modelo que aparece en la columna Nombre que la Descripción o las columnas Tipo de producto.

Por supuesto, si la palabra está en las 3 columnas, entonces esperaría que tuviera una clasificación más alta que si solo estuviera en la columna de nombre. ¿Hay alguna forma de tener un rango de fila más alto si solo aparece en Nombre vs solo en Descripción/Tipo de Producto?

+0

posible duplicado de [SQL Server ponderado búsqueda de texto completo] (http://stackoverflow.com/questions/310425/sql-server-weighted-full-text- buscar) – user7116

Respuesta

9

Puede hacer algo como la siguiente consulta. Aquí, WeightedRank se calcula multiplicando el rango de las coincidencias individuales. NOTA: desafortunadamente no tengo instalado Northwind, así que no pude probar esto, así que fíjate más en pseudocódigo y avísame si no funciona.

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 
5

Listing 3-25. Sample Column Rank-Multiplier Search de Pro Full-Text Search in 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; 
Cuestiones relacionadas