2008-10-13 8 views
9

En mi consulta de búsqueda de texto completo, deseo asignar columnas particulares a un peso más alto. Considere la siguiente consulta:¿Cómo asigno pesos a diferentes columnas en una búsqueda de texto completo?

SELECT Key_Table.RANK, FT_Table.* FROM Restaurants AS FT_Table 
INNER JOIN FREETEXTTABLE(Restaurants, *, 'chilly chicken') AS Key_Table 
ON FT_Table.RestaurantID = Key_Table.[KEY] 
ORDER BY Key_Table.RANK DESC 

Ahora, quiero que la columna Nombre de tener un coeficiente de ponderación más alta en los resultados (Nombre, palabras clave y ubicación son indexada). Actualmente, si el resultado se encuentra en cualquiera de las tres columnas, los rangos no se verán afectados.

Por ejemplo, me gustaría una fila con el nombre "Pollo frío" para tener una clasificación más alta que una con Palabras clave "Pollo frío", pero otro nombre.

Editar:

no estoy interesado en el uso CONTAINSTABLE, porque eso significaría que separa las frases (frío y de pollo, etc.), lo que implicaría que yo tenga que buscar todas las combinaciones posibles - frío y de pollo, Chilly OR Chicken, etc. Me gustaría que el motor FTS automáticamente averigüe qué resultados combinan mejor, y creo que FREETEXT hace un buen trabajo de esta manera.

Disculpas si he entendido mal cómo funciona CONTAINS/CONTAINSTABLE.

Respuesta

7

La mejor solución es usar ContainsTable. Use una unión para crear una consulta que busque las 3 columnas y agregue un número entero usado para indicar en qué columna se buscó. Ordene los resultados por ese entero y luego rango desc.

El rango es interno al servidor sql y no es algo que pueda ajustar.

También podría manipular el rango devuelto al dividir el rango por el número entero (el nombre se dividiría entre 1, palabra clave y ubicación por 2 o más). Eso causaría la aparición de diferentes clasificaciones.

He aquí algunos ejemplos de SQL
: --Recommend mediante el seguimiento de cambios de inicio y comenzar Actualizar Índice de fondo (ver los libros en línea)

 
    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 

En un entorno de producción, me gustaría insertar el resultado de la consulta en una tabla variable para realizar cualquier manipulación adicional antes de devolver los resultados (puede no ser necesario en este caso). Además, evite usar *, simplemente liste las columnas que realmente necesita.

Editar: Tienes razón acerca del uso de CONTAINSTABLE, habría que modificar las palabras clave para ser ' 'frío *' Y 'de pollo *'', me esta usando un proceso que tokenizes una frase de entrada. Si no quiere hacer eso, simplemente reemplace cada instancia de ContainsTable anterior con FreeTextTable, la consulta seguirá funcionando igual.

+1

Me preguntaba si algo usando UNION era posible, ¡pero mi cerebro no podía procesar el SQL involucrado! :) Creo que ambas son excelentes soluciones, ¡y una de ellas probablemente resolverá el problema! Déjame revisar y responderte. Sin embargo, no entendí por qué mencionó manipulaciones adicionales. –

+0

Dave, la solución sorta funciona. El problema es que la selección devuelve resultados duplicados. Supongo que la mejor opción es almacenar en una variable de tabla, como sugirió? –

+0

La selección devolverá duplicados, use la variable de tabla, luego seleccione distinct. Los duplicados se devuelven porque los valores de ColumnLocation y Rank serán diferentes en cada selección, por lo tanto, sql no los ve como duplicados al unirse por unión. –

Cuestiones relacionadas