OVH Community, your new community space.

Problemas con Score en consulta MYSQL


miminiyo
13/07/2007, 12:05
ok, ya he descubierto el problema. No sabia que necesitaba crear un campo en la tabla de la BBDD con el nombre 'score' en este caso. Una vez lo he hecho, funciona perfectamente.

Gracias por tu ayuda MarcosBL

miminiyo
13/07/2007, 08:52
Pues todo sigue igual, el mismo mensaje de error. No entiendo que puede ser.

Hay alguna otra forma de hacer algo parecido?

Gracias po el interes MArcosBL

MarcosBL
12/07/2007, 23:38
Asi a bote pronto la veo bien, prueba a indentarla a ver, algo asi:

SELECT (titulo, english, autor, year, idioma, revista, edad, lugar, taxon, tema,pdf, MATCH (titulo, english, autor, year, idioma, revista, edad, lugar, taxon, tema,pdf) AGAINST ( '$busq' ) AS Score) FROM publicaciones WHERE (MATCH (titulo, english, autor, year, idioma, revista, edad, lugar, taxon, tema,pdf) AGAINST ( '$busq' )) ORDER BY Score DESC

y nos cuentas.

miminiyo
12/07/2007, 16:58
Gracias por la respuesta MarcosBL.

Pues te pego la consulta, yo la veo bien. El Full Text Search me funciona perfecto hasta que intento ordenarlo con el Score. No se si hay que añadir algo fuera de la consulta?

'SELECT titulo, english, autor, year, idioma, revista, edad, lugar, taxon, tema,pdf, MATCH (titulo, english, autor, year, idioma, revista, edad, lugar, taxon, tema,pdf) AGAINST ( '$busq' ) AS Score FROM publicaciones WHERE MATCH (titulo, english, autor, year, idioma, revista, edad, lugar, taxon, tema,pdf) AGAINST ( '$busq' ) ORDER BY Score DESC'


En cuanto al resto del mensaje, parece una chorrada pero hasta que me di cuenta de lo del 50% y los 3 caracteres yo tambien sufri lo mio, asi que no esta mal que lo cuentes. Yo lo he resuelto con una combienación del Full text para dos o más palabras y una consulta con like si solo se mete una, y va perfecto

MarcosBL
12/07/2007, 16:41
Si pegas la consulta, te miro a ver si puedo ayudarte, en principio no creo que haya que instalar nada en el servidor, si la versión de MySQL de tu plan soporta Full Text Search, algo casi seguro.

La sintaxis en general de una búsqueda Full Text Search es algo asi:

SELECT id, titulo, texto, MATCH (titulo,texto) AGAINST
('cadena de búsqueda') AS coincidencia
FROM articulos WHERE MATCH (titulo,texto) AGAINST
('cadena de búsqueda') ORDER BY coincidencia DESC;

En este caso "coincidencia" guardaria el "score" que tú buscas, pero que no tiene porque llamarse asi para nada.

La disección de la consulta seria algo como:

SELECT id, titulo, texto, ...
- Vamos a coger el id,titulo y ...

MATCH (titulo,texto) AGAINST ('cadena de búsqueda') AS coincidencia
- también cogeremos un campo llamada coincidencia generado buscando 'cadena de búsqueda' contra los títulos y los textos de los artículos. Este valor será numérico y lo calcula MySQL por si mismo.

FROM articulos
- Dichos valores los cogeremos de la tabla "articulos"

WHERE MATCH (titulo,texto) AGAINST ('cadena de búsqueda')
- Esto indica que dicha búsqueda, la de titulo y texto contra 'cadena de búsqueda' debe existir, es decir, no devolverá los registros que no tengan al menos una concidencia de 0.0000...1 , si es 0 es que no coincide en absoluto. Tambien podriamos añadir un "WHERE MATCH (titulo,texto) AGAINST ('cadena de búsqueda')>n", lo cual obligaría sólo a devolver los registros con una coincidencia superior a n. A mayor n (1,2...5 por ejemplo), mas restrictiva es la búsqueda, es decir, más palabras tiene que haber en el titulo o en el texto para que salga como resultado.

ORDER BY coincidencia DESC
- Esto indica que, aprovechando que tenemos un campo que nos facilita la coincidencia de nuestra búsqueda, aprovechémoslo para ordenar los resultados por ese campo, de forma DESCendente, asi tendremos primero los mas coincidentes, y después los menos.

Una última nota... de la que casi nadie se da cuenta.

Cuando haces experimentos con MySQL Full Text Search, solemos meter dos o tres registros en la base de datos y ponernos a hacer pruebas. Y suele fallar, dándonos siempre 0 resultados.

¿ Esto porque ? Muy sencillo: Para evitar consultas que generen transferencias de datos muy bestias, MySQL considera que una consulta full text que devuelva el 50% o más de los registros.. tiene algo mal, y nos devuelve 0 resultados. Es decir, si tenemos 3 registros:

"Coche de carreras", "Coche de caballos", "Locomotora de vapor"

Y buscamos "Coche", nos devolverá 0, porque los resultados (2) suponen más del 50% (2 de 3, 66%) de los resultados.

Sin embargo, si tenemos:
"Coche de carreras", "Coche de caballos", "Locomotora de vapor", "Avión", "Bicicleta"

Buscar "Coche" nos devolverá "Coche de carreras", "Coche de caballos" sin problemas.

Sin embargo, buscar " de " seguirá devolviendo 0, ya que coincide con 3 de los 5 registros, superando el 50%

Lo comento porque en su dia, hasta que lei la documentación, esto me trajo de cabeza.

Además, MySQL tiene definidas "de serie" unas cuantas "stopwords" o palabras que directamente ignora en las búsquedas, por ser tremendamente comunes: "if, the, of...", si queremos que en nuestro caso ignore las correspondientes al castellano, tendriamos que tener acceso al my.cnf del servidor para definirlas, en este fichero se define que stopwords es el fichero /ruta/fichero.txt, donde fichero.txt tiene las susodichas stopwords, no recuerdo si una por linea o separadas por comas... en la documentación tiene que venirte.

Y ya por último (lo juro), indicar que MySQL ignora tambien en estas búsquedas las palabras de menos de "n" caracteres, donde n depende por defecto de la distribución de MySQL, aunque si no me equivoco suele estar definida en 3, es decir, palabras de 3 caracteres o menos se ignoran en las búsquedas. Esto es configurable también por medio del my.cnf, simplemente cambándolo por un 2 (Imagina que quieres buscar el texto "PHP"... son 3 caracteres, no podrias con una instalación estandard).

Lamento el ladrillo... se me ha ido un poco la mano :-)

miminiyo
12/07/2007, 13:01
Hola, tengo contratado un alojamiento 300GP. Estoy haciendo un buscador en mi web, con Full text Search. El tema es que intento ordenarlo con el SCORE para que lo saque en función de la coincidencia con los criterios pero me da el siguiente error: Unknown column 'Score' in 'order clause'

Creo que el códigho esta bien. Alguien sabe si hay que activar algo en el Servidor?

Gracias