Page 1 of 2

Full text Search

Posted: Tue Jan 30, 2007 6:46 pm
by Otto
How could I manage a full text search in the whole database like LOCATE but in all fields?
Regards
Otto

Posted: Tue Jan 30, 2007 6:52 pm
by Antonio Linares
Otto,

At( cText, MemoRead( "file.dbf" ) )

once found, substract the DBF header size, and divide it by the record size

Posted: Tue Jan 30, 2007 7:33 pm
by Otto
Thank you. I there a limit for memoread: FW FWH

Regards
Otto

Posted: Tue Jan 30, 2007 10:01 pm
by Antonio Linares
Otto,

MemoRead() is a Harbour function. There is no size limit (max. 4 gigs)

Posted: Tue Jan 30, 2007 11:34 pm
by Gale FORd
If you have xHarbour from .com then you can use FTS (Full Text Search) to create index and search.

Posted: Wed Jul 18, 2007 5:07 am
by hua
Antonio Linares wrote: At( cText, MemoRead( "file.dbf" ) )

once found, substract the DBF header size, and divide it by the record size
This is a neat trick! What further modification need to be done to take into account contents of memo fields also?

Posted: Wed Jul 18, 2007 6:38 am
by Antonio Linares
memo fields require a different approach as they are not stored in the DBF, but on an external file. You can search in such external file, and then you should search its offset into the DBF.

You may ask Przemek how to get the memo offset from the DBF

Re: Full text Search

Posted: Wed Jul 18, 2007 7:58 am
by StefanHaupt
Otto,
Otto wrote:How could I manage a full text search in the whole database like LOCATE but in all fields?
Regards
Otto
you can try the Hiper-Seek functions of xHarbour. That´s a very fast seek over all fields in dbf. But I don´t know, if it supports memo too.

Here is an example:



Code: Select all

#INCLUDE "Fivewin.ch"
#include "dbinfo.ch"

//REQUEST RMDBFCDX
REQUEST DBFCDX
//REQUEST BMDBFCDX

PROCEDURE Main()
   FIELD FIRST, LAST, STREET, CITY
   LOCAL n, hs

   rddSetDefault( "DBFCDX" )
//   rddSetDefault( "BMDBFCDX" )
//   if ascan( rddList(1), "RMDBFCDX" ) != 0
//      rddSetDefault( "RMDBFCDX" )
//   endif
//   ? RddSetDefault ()
   use test
   hs := HS_INDEX( "test", "FIRST+LAST+STREET+CITY", 2, 0, , .T., 3 )

   /* Look for all records which have 'SHERMAN' string inside */
   HS_SET( hs, "SHERMAN" )
   while ( n := HS_NEXT( hs ) ) > 0
      dbgoto( n )
      if HS_VERIFY( hs ) > 0
         ? rtrim( FIRST+LAST+STREET+CITY )
      endif
   enddo
//   wait

   /* Does RDD support Record Map Filters? */
//   if dbinfo( DBI_RM_SUPPORTED )
      /* if yest then let set filter for all records with 'SHERMAN'
         word and look at them in browser */
      HS_FILTER( hs, "SHERMAN" )
      DbSetFilter( {|| "SHERMAN"},  "SHERMAN" )
      dbgotop()
      browse()
//   endif

   HS_CLOSE( hs )
   CLOSE ALL
   QUIT

RETURN

Memoread

Posted: Thu Jun 26, 2008 8:36 pm
by Otto
Hello Antonio,

I would like to use your solution.
But now I face the problem that some dbf files only return 4 or 5 bytes.
If I try to open the clients.dbf form the Fivewin sample this is the result:

local cText := MemoRead( "clientes.dbf" )

msginfo(ctext )

Image



Otto,

At( cText, MemoRead( "file.dbf" ) )

once found, substract the DBF header size, and divide it by the record size
_________________
regards, saludos

Antonio Linares

Posted: Thu Jun 26, 2008 8:54 pm
by Antonio Linares
Otto,

You can't see it as it has embedded zeroes. Try this:

MsgInfo( Len( ctext ) )

Posted: Thu Jun 26, 2008 9:12 pm
by Otto
Thank you Antonio.

Posted: Wed Nov 26, 2008 12:04 pm
by Ollie
Hi Stefan,

I get a "Unresolved External _HB_FUN_HS_INDEX" error when I try to compile your test. According to the help file I need - xhb.lib - is that correct? I can't find that lib on my PC, and yet I have xHarbour? Any ideas as to what I am doing wrong?

Did you ever find out if the Hyperseek works on MEMO fields too?

Antonio, do you know how to get the memo offset from the DBF if I use your method? (in case Hyperseek doesn't work for MEMOs)

Posted: Wed Nov 26, 2008 2:11 pm
by Antonio Linares
Ollie,

> Antonio, do you know how to get the memo offset from the DBF

What RDD are you using ?

Posted: Wed Nov 26, 2008 2:15 pm
by Ollie
DBFCDX

Posted: Wed Nov 26, 2008 2:29 pm
by Antonio Linares
Ollie,

I guess that you could use:

DbInfo( DBI_BLOB_OFFSET )
http://www.ousob.com/ng/53guide/ng28fbc.php

and/or

DbFieldInfo( DBS_BLOB_OFFSET )
http://www.ousob.com/ng/53guide/ng25343.php