[sword-devel] Faster searching wanted

Troy A. Griffitts sword-devel@crosswire.org
Sat, 30 Mar 2002 14:55:17 -0700


Nathan,
	Sorry for not getting back to you sooner.  I'm excited about your
efforts!!!  You don't know how many times people have asked, "do you
anything for the Mac?"

Good place to start to understand some of the basics of the API are:

API Primer:
http://www.crosswire.org/sword/develop/swordapi/apiprimer.jsp

tests:
sword/tests

utilities:
sword/utilities

examples:
sword/examples
(which, it seems, you've already found)


To answer some of your questions:
You shouldn't need to ever call setBooks(...) unless you're doing
something to extend the lib.

see sword/tests/parsekey for an example of how to get book names in
another locale (e.g. try parsekey "jn1:1-5,9;jas2" de), provided you
have locales.d/*.conf installed same place as your mods.d directory

To get book name from a VerseKey, you may use const char
*VerseKey::getBookName()

You might want to access the books structure directly for some
circumstances, but mostly it's used internally by methods like
getBookName.

Here's how you'd do it with the books member:

VerseKey key = "jn1:1";

key.books[key.Testament()-1][key.Book()-1].name;

You may jump to the end of a chapter or book with the positioners:
MAXCHAPTER and MAXVERSE

key = MAXCHAPTER;
key = MAXVERSE;

RE searching.  The engine defaults to a scan text search.  No indecies
are used.  Each driver is welcome to implement a searching mechanism
that may be more efficient for the way the driver stores text.  There is
an example of such in the RawText driver.  There is a utility that will
call an initializer (to build indexiced, or what have you) that the
driver may need to do on a text.  You can try running it:
sword/utilities/mkfastmod.  If you run it on any module that has
ModDrv=RawText you will get indexed search example for multiword
searches, from that point on, for that module.  The hope was that
drivers would implement indexed searches in the future, and we have
individuals volunteering for such work.  So maybe in the future it will
be faster.  AGAIN, the RawText::Search is JUST AN EXAMPLE of how to
override the default search mechanism, it was never intended to be used
for production :)

That said.  We usually do an optimization pass now and again, and can
get a given search down to about 2 seconds max on a decent machine.  My
1.4Ghz box usually gets about .8 seconds.

Please ask questions here or join #sword on irc.openprojects.net! 
Talking to people who've waded thru an API is the quickest way to learn
one!

	-Troy.



Nathan Youngman wrote:
> 
> Well - I haven't necessarily done the best tests. I tried the search
> example, which was pretty slow. Threaded_search was better, and maybe
> implemented in a GUI with results being displayed progressively
> would be okay. I did try the Windows client, but only under Virtual
> PC under Mac OS X - which tends to be slow for everything :-).
> 
> I will try some kind of progressive display to minimize any
> "perceived slowness" - that is, whenever I get to searching. Right
> now I'm still just trying to figure out how to get data from VerseKey
> to populate my  interface. Long ways to go...
> 
> Of course if the speed can be improved - that couldn't be a bad
> thing. It will be nice to swap out the 1.5.3 library with a newer one
> and suddenly everything is faster/better :-).
> 
> - n8
> 
> >Well, I'm excited now because I think I have found something that I could
> >work on.  In my experience with sword searching was actually quite quick and
> >I never really had a 'slow' search.  However, if you (all of you, any of
> >you) see a need for a better search technique I would be willing to try to
> >get that running more smoothly.  As soon as I upgrade from msvc++ to BCB5
> >and install the necessary components I will be glad to work on this...
> 
> --
> Nathan Youngman
> E-mail: sword at nathany.com
> Web: http://nathany.com