FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Busqueda Tipo Google
Posts: 3
Joined: Wed Jan 30, 2008 02:35 PM

Busqueda Tipo Google

Posted: Sat Sep 17, 2011 05: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

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Busqueda Tipo Google

Posted: Mon Sep 19, 2011 05: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
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Busqueda Tipo Google

Posted: 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 (fw): Select all Collapse
    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

Continue the discussion