Busqueda Tipo Google

Post Reply
thernandez
Posts: 3
Joined: Wed Jan 30, 2008 2:35 pm
Location: Mexico

Busqueda Tipo Google

Post by thernandez »

Buenas tardes a todos los integrantes de estos foros

agradezco de antemano a toda la comunidad de estos foros

quiero saber si hay alguna funcion que permita hacer busquedas tipo Google en archivos .dbf

saludos cordiales
Tomas Hernandez
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Busqueda Tipo Google

Post by Antonio Linares »

Una buena explicación del modelo que usa Google:

http://jimbojw.com/wiki/index.php?title ... d_BigTable
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Busqueda Tipo Google

Post by Antonio Linares »

Nosotros ya comentamos en estos foros como hacer una busqueda muy rapida de un cierto texto en una DBF de una forma realmente rápida:

http://forums.fivetechsupport.com/viewt ... 455#p89455

Basicamente se trata de cargar toda la DBF en memoria y buscar el texto usando At(). A la posición obtenida se le resta el tamaño de la cabecera de la DBF y se divide por el tamaño de un registro y obtenemos el número de registro en el que está sin necesidad de hacer USE, SKIP, etc.

En el caso de que las palabras que se quieran buscar no esten seguidas, aqui tienes una rutina que usa Hashes y optimiza mucho la búsqueda:

Code: Select all

    local hWords := Hash(), nField, nWord, cWord

   USE yourDbf

   while ! Eof()
      for nField = 1 to FCount()
         nWord = 1
         while ! Empty( cWord := StrToken( FieldGet( nField ), nWord++ ) )
            TRY
               hWords[ cWord ] = nOr( hWords[ cWord ], 2 ^ ( RecNo() - 1 ) )
            CATCH
               hWords[ cWord ] = 2 ^ ( RecNo() - 1 )
            END
         end
      next
      SKIP
   end                   

   // MsgInfo( hWords[ cWord1 ] )
   // MsgInfo( hWords[ cWord2 ] )
   MsgInfo( nAnd( hWords[ cWord1 ], hWords[ cWord2 ] )
Basicamente lo que se hace es guardar un número por palabra, en el que se anota a nivel de "bit" el registro en el que está dicha palabra. Haciando nAnd() (tambien se podria hacer nOr(), etc...) se consigue un número en donde sus "bits" representan los registros en los que estan esas palabras. Podemos buscar tantas palabras como queramos, consiguiendo asi hacer búsqueda libre al estilo "Google" :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply