Firebird sentencia: buscar coincidencias en una columna
Hola a tod@s,
quisiera hacer una consulta de una tabla para extraer los registros que más coincidan en una columna con la frase que busco. Imagino que es algo como lo que suelen hacer los buscadores tipo google. Es decir, si por ejemplo busco en una tabla de entidades la entidad: 'palabra1 palabra2 palabra3' quisiera que la consulta me mostrara los resultados que encuentre en la tabla ordenado de mayor coincidencia a menor coincidencia, por ejemplo: resultado: palabra2 palabra3 palabra1 palabraX palabra3 palabra2 palabra1 palabra3 palabra2 palabraY palabra1 palabraZ palabraQ Observar que el orden del valor del registro puede ser distinto al criterio que busco, pero debe mostrarme primero los registros que mayor coincidencia tengan. Estoy seguro de que debe haber una función en firebird que haga esto. El like no acaba de servir para lo que intento hacer ya que al montar la sentencia parecida a: select * from entitades where columna like '%palabra1%' or like '%palabra2%' or like '%palabra3%' El resultado no me lo ordenaría si encuentra las 3 palabras o si sólo encuentra 1. Si pongo AND en lugar de OR sólamente me encontraría resultados que contengan las 3 palabras y podría interesarme los registros que contengan 2 palabras. ¿Alguna idea? |
select match against
En mysql hay una sentencia que ayuda a buscar coincidencias:
SELECT MATCH AGAINST http://forums.digitalpoint.com/showthread.php?t=27529 y esto es lo que busco para firebird. ¿Sabéis si existe? Gracias |
No, no existe nada similar para Firebird.
Pero te puedes construir una consulta, parecida a la que proponías inicialmente, en la que además calculas el número de coincidencias sobre las palabras buscadas, y ordenas de mayor a menor en función de esas coincidencias. Por ejplo., para buscar por 3 palabras :
Naturalmente puedes ampliar la consulta hasta 10, 15, 20 o 50 palabras, de manera que la misma consulta te sirva para cualquier búsqueda que quiera hacer el usuario (en un momento dado solo tendrás que asignar valor a tantos parámetros como palabras está buscando el usuario). Saludos. |
Gracias Marc,
Me ha ido a la perfección. No es la primera vez que busco y pienso que tendrá una solución complicada o desconocida y me encuentro con que es más sencillo de lo que hubiera imaginado. Un saludo. |
Qué sentencia tan interesante, no se me había ocurrido nunca algo así. Me la guardo :)
|
Cita:
A mi también me sorprendió la sencillez del resultado. Y es que siempre leemos que la falta de un motor Full Text Search es una de las grandes lagunas de Firebird, pero queda claro que para casos sencillos como este no debería ser mayor problema. A medida que leía el problema, iba pensando que si ya tenemos el resultado, ordenarlo por relevancia no debería ser tan difícil. De ahí ya solo quedaba un paso para calcular las coincidencias mediante un CASE. Saludos. |
Para casos más complejos, he visto una colección de procedimientos almacenados (con unas tablas relacionadas de soporte) que pueden emular un motor Full Text Search.
Esta solución es muy interesante, ya que no necesita instalar nada en el cliente o en el servidor. Todo va en la misma base de datos (mediante tablas y procedimientos almacenados), y se puede usar con consultas normales. http://www.ibphoenix.com/downloads/F...H-TPZ303-R.zip Saludos. |
Sí, pero también hay que tener experiencia para que se te ocurra, conocimientos para ponerlo en práctica, imaginación para idearlo... y ser capaz de hacerlo y que fiinalmente funcione :D
Así que gracias por compartirlo :) |
Genial Codigillo, me sirvio!
Me sirvió bastante para algo similar que necesitaba guillotmarc !!
Cita:
|
Cita:
Hola, crea un hilo nuevo con tu duda, ya que la misma no tiene nada que ver con lo que se trata en este hilo. Recuerda nuestra guía de estilo, gracias. Y en cuanto a tu pregunta, es un tema que se ha tratado muchas veces, intenta hacer una búsqueda por los foros y si no lo encuentras entonces crea un hilo nuevo. Gracias. |
La franja horaria es GMT +2. Ahora son las 19:58:36. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi