Busqueda Tipo Google

Busqueda Tipo Google

Postby thernandez » Sat Sep 17, 2011 5:22 pm

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
thernandez
 
Posts: 3
Joined: Wed Jan 30, 2008 2:35 pm
Location: Mexico

Re: Busqueda Tipo Google

Postby Antonio Linares » Mon Sep 19, 2011 5:01 am

Una buena explicación del modelo que usa Google:

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

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

Re: Busqueda Tipo Google

Postby Antonio Linares » Mon Sep 19, 2011 11:46 am

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:

viewtopic.php?p=89455#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  Expand view  RUN
   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
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 75 guests