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
Busqueda Tipo Google
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Busqueda Tipo Google
Una buena explicación del modelo que usa Google:
http://jimbojw.com/wiki/index.php?title ... d_BigTable
http://jimbojw.com/wiki/index.php?title ... d_BigTable
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Busqueda Tipo Google
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:
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"
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 ] )