sql-server - indice - full text search sql server 2008 ejemplos
¿Cómo asigno pesos a diferentes columnas en una búsqueda de texto completo? (1)
En mi consulta de búsqueda de texto completo, deseo asignar columnas particulares a un peso más alto. Considera esta consulta:
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 tenga un mayor peso en los resultados (el nombre, las palabras clave y la ubicación están indexados en texto completo). Actualmente, si el resultado se encuentra en cualquiera de las tres columnas, los rangos no se verán afectados.
Por ejemplo, me gustaría tener una fila con el nombre "Pollo frío" para tener un rango más alto que uno con Palabras clave "Pollo frío", pero otro nombre.
Editar:
No estoy ansioso por usar ContainsTable, porque eso significaría separar las frases (Chilly AND Chicken, etc.), lo que implicaría tener que buscar todas las combinaciones posibles: Chilly AND Chicken, Chilly OR Chicken, etc. Me gustaría que Motor FTS para determinar automáticamente qué resultados combinan mejor, y creo que FREETEXT hace un buen trabajo de esta manera.
Disculpas si no entendí cómo funciona CONTAINS / CONTAINSTABLE.
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 dividiendo el rango por el entero (Name se dividiría entre 1, Keyword y Location por 2 o más). Eso causaría la aparición de diferentes clasificaciones.
Aquí hay un ejemplo de sql
: - Recomiende usar el seguimiento de cambio de inicio e iniciar el índice de actualización de fondo (ver 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, insertaría el resultado de la consulta en una variable de tabla 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: tiene razón sobre el uso de ContainsTable, tendría que modificar las palabras clave para que sean '''' chilly * "Y" pollo * "'', hago esto usando un proceso que tokeniza una frase de entrada. Si no quiere hacer eso, simplemente reemplace cada instancia de ContainsTable anterior con FreeTextTable, la consulta seguirá funcionando igual.