2009-11-26 7 views
9

Tengo lo que creo que es un escenario muy básico, pero lo que he leído lo hace sonar como que esto no es fácil utilizando el catálogo de SQL Server de texto completo y los índices.Columnas múltiples con ContainsTable y lógica booleana con índice de texto completo

Tengo 2 columnas, nombre y apellido. Quiero admitir la búsqueda de texto completo en ellos de modo que si alguien escribe "John Smith" personas con una coincidencia en , ambos primero y el último aparecen primero.

Aunque es fácil crear un índice en varias columnas y es fácil de buscar en múltiples columnas, la puntuación no refleja múltiples columnas.

SELECT [Key], Rank 
FROM CONTAINSTABLE([User], (FirstName,LastName), '<CLAUSE_HERE>') 
  1. Si CLAUSE_HERE es "John Smith" no da resultados positivos, ya que esa frase no existe en cualquiera de los campos.
  2. Si es "john OR smith" obtengo todos los usuarios con cualquier nombre en cualquier campo, ordenados en un orden inútil.
  3. Si es "john AND smith" no obtengo ningún resultado, porque ninguno de los campos contiene ambas palabras.

parece que la única solución es autogenerar una consulta que se ejecuta containstable en cada campo, hace algunos cálculos, resume las puntuaciones, etc. ¿Eso suena bien? ¿Hay una manera más fácil de evitarlo? Mi consulta real tiene muchos más campos, este es un ejemplo simplificado.

Respuesta

11

Haz un computed column que combina los campos que te interesan para buscar (de una manera que tenga sentido para tus formatos de búsqueda), y el índice de texto completo.

Que yo sepa, esta es la única solución si desea texto completo de esta manera debido al comportamiento que describe en su pregunta.

+0

Totally worked !! ¿Por qué el texto completo no hace esto automáticamente? Pensé que aplicar texto completo en varias columnas funcionaría así desde el primer momento. adivina no. –

0

Debería probarlo, pero me pregunto si podría usar la función ISABOUT() para aplicar un peso a cada palabra clave. Su cláusula de búsqueda podría ser similar a:

ISABOUT(john weight(0.2), smith weight(0.8)) 
+0

No es una mala idea, pero no funciona. La forma en que funciona la puntuación no parece sumar en columnas. Entonces, "John Smith" obtiene el mismo puntaje exacto que "John Jones" en mis pruebas. –

+0

¿Qué versión de SQL Server estás usando? ¿Tienes un script de muestra/prueba? – RickNZ

Cuestiones relacionadas