2011-09-16 18 views
7

Tengo un pequeño problema (eso es lo que espero) al clasificar mis resultados de búsqueda de texto completo en la base de datos de MySQL. He tratado de escribir de dos maneras:Ranking de búsqueda de texto completo

forma natural:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,keywords) AGAINST('$cl_search') AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

MANERA BOOLEANA:

SELECT SQL_CALC_FOUND_ROWS *, 
((MATCH(productname) AGAINST('$cl_search' IN BOOLEAN MODE))+ 
(MATCH(keywords) AGAINST('\"$cl_search\"' IN BOOLEAN MODE))) AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

me gusta la indexación consigo cuando busco en el modo de lenguaje natural, pero ¿cómo puedo evitar que alguien entre, es decir, "bolso, bolsa, bolsa, bolsa" como nombre del producto para obtener buenos resultados de búsqueda?

Así que escribí la forma booleana de arreglar eso pero 1. es más lento y 2. No obtengo la otra indexación de relevancia como 'en comparación con el conteo de palabras'.

¿Alguna idea sobre cómo obtener lo mejor de ambos mundos?

Respuesta

-3

Bastante sencillo, use Lucene en cambio, es mucho más avanzado y seguramente tiene opciones para manejar lo que quiere.

1

¿Qué hay de escribir una función definida por el usuario, que eliminará las palabras clave duplicadas? Así que su consulta se verá así:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') AS score 
FROM products 
    WHERE MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') 
    ORDER BY score DESC,lastupdated DESC; 
Cuestiones relacionadas