Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consultas tipo Google (https://www.clubdelphi.com/foros/showthread.php?t=85391)

santiago14 12-03-2014 13:57:41

Consultas tipo Google
 
Bueno, no se si el título es adecuado, paso a explicar lo que quiero.

Quiero buscar la frase "Club Delphi". Necesito que el resultado me devuelva registros donde encuentre: club, delphi, club delphi, Club, Delphi, Club Delphi.

Ya he resuelto el tema de las mayúsculas/minúsculas, acentos; pero no doy con la forma de buscar frases.

Espero haberme explicado bien.

Gracias.

jafera 12-03-2014 16:08:27

Hola Santiago.

Con la clausula like no te funciona?

Saludos

santiago14 12-03-2014 16:41:44

Cita:

Empezado por jafera (Mensaje 473634)
Hola Santiago.
Con la clausula like no te funciona?
Saludos

No, no alcanza. Lo explico mejor.

Tengo una tabla:
Código SQL [-]
nombres_libros
cod_libro: integer
nombre_libro: string
autor: string
cantidad_paginas: integer
editorial: string:
estado_libro: string
......

Uso Delphi XE5, Firebird 2.1.
Se presenta una ventana donde me deben devolver los libros que tengo, y los criterios de búsqueda son, por ejemplo: por nombre del libro, por nombre del autor.
Ahora bien, el tipo de busca un libro por autor: "Gabriel García Márquez"
Lo que quiero que la consulta devuelva son los registros que tengan autores con, por ejemplo: Gabriel García Márquez; Gabriel; Márquez; García, ...
Bajo este concepto, me tendría que devolver libros de Gabriel García Márquez, Gabriel Hurtado, Juan Márquez Linares, etc., etc.

Bueno, espero que ahora esté mejor explicado.

Gracias.

Neftali [Germán.Estévez] 12-03-2014 16:53:22

Tendrás que dividir en palabras antes de realizar la búsqueda y luego utilizar OR.

jafera 12-03-2014 17:10:41

Hola de nuevo.

Comente lo del like ya que pensaba que buscabas por una parte de codigo determinado, al poner Gabr, te buscaria la cadena que contuviera Gabr, tanto Gabriel , como Gabrino, etc. Ahora si que con el ejemplo he visto realmente lo que quieres buscar.

Supongo que la respuesta de Neftali es la idonea, yo no he utilizado nunca una búsqueda así, la considero un poco ambigua ya que si buscas por Gabriel Garcia no le veo el porque te tiene que devolver Juan Marquez, diferente si buscaras Marquez que te devolviera todos.

En fin cada aplicación tiene sus entresijos y necesidades y estos los conoce solo el programador y quien le ha encargado el trabajo.

Seguiré atento al hilo por si puedo aprender algo nuevo para un futuro, nunca se sabe....

Saludos

Josep

santiago14 12-03-2014 17:53:07

Cita:

Empezado por Neftali (Mensaje 473637)
Tendrás que dividir en palabras antes de realizar la búsqueda y luego utilizar OR.

Esta opción me gusta. Ahora bien. ¿Alguna función en Delphi que le pase una frase y me devuelva todas las palabras separaditas?

Que se yo:
Código Delphi [-]
var
  palabras:array of string;
begin
  palabras:=separar_palabras['Gabriel García Márquez'];
//Aquí tendría que obtener un array que contenga en cada componente una palabra.
end;
Pero creo que esto es un buen comienzo.

mamcx 12-03-2014 18:56:45

Eso se llama "Full text search". FB no tiene soporte nativo, pero hay opciones:

http://stackoverflow.com/questions/9...ird-and-delphi

(Ahi mencionan a MUTIS, un proyecto mio pero ya esta muerto).

En cambio, con Sqlite / Postgres es trivial, ya que viene de fabrica. Seria muy facil de integrar sqlite (ya que es embeido).

Tengo un ejemplo en python, pero tiene los links con mas info:

http://runnable.com/Ur8myPOxx4hmAARP...query-and-fts4

Una explicacion del fundamento de todo esto:

https://www.tbray.org/ongoing/When/2...30/OnSearchTOC

https://en.wikipedia.org/wiki/Search_engine_indexing

(En especial, el indice invertido y el de sufijo).

P.D: El sitio de firebird enlaza aun tutorial de como hacer una implementacion de FTS:

http://www.firebirdfaq.org/faq328/

Al González 12-03-2014 21:28:51

Cita:

Empezado por santiago14 (Mensaje 473643)
¿Alguna función en Delphi que le pase una frase y me devuelva todas las palabras separaditas?
Código Delphi [-]
var
  palabras:array of string;
begin
  palabras:=separar_palabras['Gabriel García Márquez'];
end;

Sobre esto encontrarás muchos ejemplos tanto en Club Delphi como en el resto de la Red. En caso de usar GHF, cuentas con la función ghSplit:
Código Delphi [-]
Var
  Palabras :TStringDynArray;  // De la unidad "Types" de Delphi
Begin
  Palabras := ghSplit ('Gabriel García Márquez');
Tiene la ventaja de que ignora los espacios que aparezcan de forma consecutiva. NOTA: Tengo pendiente optimizar el código de esta función (actualmente no me gusta).

Neftali [Germán.Estévez] 13-03-2014 09:58:21

Cita:

Empezado por santiago14 (Mensaje 473643)
Esta opción me gusta. Ahora bien. ¿Alguna función en Delphi que le pase una frase y me devuelva todas las palabras separaditas?

Es posible que la clase TStringList y las propiedades DelimiterText y Delimiters de dicha clase te puedan ayudar en eso.

Neftali [Germán.Estévez] 13-03-2014 10:23:42

Cita:

Empezado por santiago14 (Mensaje 473635)
Lo que quiero que la consulta devuelva son los registros que tengan autores con, por ejemplo: Gabriel García Márquez; Gabriel; Márquez; García, ...
Bajo este concepto, me tendría que devolver libros de Gabriel García Márquez, Gabriel Hurtado, Juan Márquez Linares, etc., etc.

El hecho de encontrar 1,2,3... elementos de los que se buscas, también te puede servir a posteriori (no se si es el caso y te puede ser útil) para devolver losresultados con una determinada prioridad. Un resultado que tenga 2 elementos coincidentes deberías aparecer con mayor prioridad que otro que sólo tenga 1.


La franja horaria es GMT +2. Ahora son las 04:51:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi