Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-04-2011
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 14-04-2011
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
Question 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
Responder Con Cita
  #3  
Antiguo 14-04-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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 :

Código SQL [-]
select CLI_DIRECCION,
       (case when CLI_DIRECCION containing :PALABRA1 then 1 else 0 end +
        case when CLI_DIRECCION containing :PALABRA2 then 1 else 0 end +
        case when CLI_DIRECCION containing :PALABRA2 then 1 else 0 end) as COINCIDENCIAS
from CL_CLIENTES
where CLI_DIRECCION containing :PALABRA1 or
      CLI_DIRECCION containing :PALABRA2 or
      CLI_DIRECCION containing :PALABRA3
order by COINCIDENCIAS descending

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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 14-04-2011 a las 20:35:16.
Responder Con Cita
  #4  
Antiguo 15-04-2011
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 15-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Qué sentencia tan interesante, no se me había ocurrido nunca algo así. Me la guardo
Responder Con Cita
  #6  
Antiguo 15-04-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Qué sentencia tan interesante, no se me había ocurrido nunca algo así. Me la guardo
Ya me imaginé que te gustaría .

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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 15-04-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #8  
Antiguo 15-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Así que gracias por compartirlo
Responder Con Cita
  #9  
Antiguo 02-05-2019
clauxs88 clauxs88 is offline
Miembro
 
Registrado: feb 2013
Ubicación: Asuncion
Posts: 11
Poder: 0
clauxs88 Va por buen camino
Genial Codigillo, me sirvio!

Me sirvió bastante para algo similar que necesitaba guillotmarc !!

Cita:
Empezado por guillotmarc Ver Mensaje
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 :

Código SQL [-]
select CLI_DIRECCION,
       (case when CLI_DIRECCION containing :PALABRA1 then 1 else 0 end +
        case when CLI_DIRECCION containing :PALABRA2 then 1 else 0 end +
        case when CLI_DIRECCION containing :PALABRA2 then 1 else 0 end) as COINCIDENCIAS
from CL_CLIENTES
where CLI_DIRECCION containing :PALABRA1 or
      CLI_DIRECCION containing :PALABRA2 or
      CLI_DIRECCION containing :PALABRA3
order by COINCIDENCIAS descending

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.
Responder Con Cita
  #10  
Antiguo 02-12-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por hugobenitez Ver Mensaje
Hola! buenos dias! como siempre agradezco que este tipo de grupos y personas existan para los novatos como yo. Pregunta: supongamos que quiero buscar al mismo tiempo que escribo, abrir y cerrar (open y close) el TFDQuery todas las veces que apreto una tecla es la unica forma? no hay otra forma como haciamos antes con FINDKEY en PARADOX? o no le hace nada a la base de datos (supongamos una base firebird en red) que abramos y cerremos cada letra que escribimos? Desde ya mil gracias a todos por siempre estar!

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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error en concatenacion de Sentencia SQL, Firebird 2.5 Adrian Murua SQL 15 02-04-2011 01:08:00
¿Cómo buscar todas las coincidencias en una base de datos en un software de lotería? Master23 Varios 3 03-07-2010 20:19:21
Cuantas coincidencias???? eduarcol Humor 2 10-09-2007 22:30:33
Duda en sentencia de firebird vivamotos Firebird e Interbase 6 10-09-2007 12:17:18
Añadir columna a dbrid, que muestre sentencia calculada, en runtime niñotaliban Conexión con bases de datos 2 28-02-2007 12:54:28


La franja horaria es GMT +2. Ahora son las 14:30:54.


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
Copyright 1996-2007 Club Delphi