2008-10-28 10 views
7

Tengo algunos problemas con la clasificación utilizada por la búsqueda de texto completo en SQL Server.Método de clasificación utilizado por SQL Server para la indexación de texto completo

Supongamos que un usuario busca dos palabras, "foo bar". Suponemos que el usuario tiene la intención de hacer una búsqueda OR, por lo que pasamos "foo O bar" a nuestra llamada CONTAINSTABLE. Lo que estamos descubriendo es que una fila que contenga "foo" 10 veces pero que no contenga "bar" tendrá un rango mucho más alto que una fila que tenga tanto "foo" como "bar". Quisiéramos que la fila que tiene ambos términos sea preferida sobre una fila que solo tiene un término varias veces. ¿Algún consejo sobre cómo lograr esto?

He encontrado documentación relacionada con un modificador RANKMETHOD, pero parece ser solo para la búsqueda SQL Enterprise y no está disponible en las instalaciones normales de SQL Server 2005. También podríamos cambiar a Lucene.Net, pero espero verificar que tenga la mejor clasificación disponible. También podríamos realizar búsquedas múltiples y fusionar los resultados, pero eso parece no deseable a medida que aumenta la cantidad de palabras buscadas.

Respuesta

1

Solo para el seguimiento de esto .. El motivo por el que la clasificación era baja para las filas que contienen cadenas A y B al hacer coincidir con la cadena "A o B" es que A estaba en una columna diferente a B. Si creo una vista en la tabla que combina esas columnas en una sola columna, el ranking para "A o B" es más de lo que esperaba.

1

hice una breve discusión sobre los índices invertidos y coseno Clasificación (los algoritmos básicos y estructuras de datos de los sistemas de recuperación de texto completo) Here.

En un ranking pura coseno, foo (1), bar (1) debe estar más cerca del vector ocupado por foo, bar que foo (10), bar (0). Uno puede alterar el valor del coseno post-hoc, que es esencialmente lo que hace Pagerank. Si la búsqueda de texto completo está jugando con la clasificación del coseno después de calcular el producto de puntos en lugar de ponderar los ejes, esto explicaría la importancia desproporcionada de foo.

2

RANKMETHOD no está disponible para ninguna edición de SQL Server. Si está creando las palabras clave para pasar a la búsqueda CONTAINSTABLE y sabe algo sobre qué palabras son más "importantes", puede clasificar las palabras con ISABOUT y WEIGHT.

Por ejemplo, si foo tiene un rango superior al de la barra, se podría hacer algo como esto:

SELECT * FROM CONTAINSTABLE (YourFullTextTable, *, 'ISABOUT (PESO "foo" (0,5), "barra" PESO (0.3)) ')

2

Intente reescribir la consulta SELECCIONE * FROM CONTAINSTABLE (YourFullTextTable, *,' "foo bar" o "foo" ~ "bar" o "foo o barra" '). Esta consulta en esencia debe clasificar cualquier registro con "foo bar"> "foo" exacto cerca de "bar"> foo o barra

Cuestiones relacionadas