28. Juni 2011

DE_flag GB_flag

for english readers

So einfach wie möglich

find

Teil des Google-Erfolges ist, die Suche so einfach wie möglich zu gestalten und trotzdem zu finden, nach was ich suche. In iTunes gibt es ebenfalls nur dieses eine Suchfeld. Egal was ich suche, es wird gefunden. Das eine Suchfeld lieben meine Anwender in ihren 4D-Anwendungen.

Bis V11 einschließlich habe ich mehrere Felder durchsucht. In Adressen habe ich zu erst nach den Namen gesucht, dann nach den Adressdaten, danach in anderen Feldern und die indizierten bevorzugt. Finde ich keine Datensätze mit dem exakten Suchtext suche ich mit angehängtem Klammeraffen und findet beginnt mit keine Datensätze setze ich noch einen Klammeraffen voran. Selbst in der 2004 war diese Komfort-Suche schnell genug für die meisten Anwendungsfälle. Die Anwender sind es zufrieden.

Seit der V12, kann ich mir Arbeit sparen. Die Zauberformel heißt Volltext-Index. Das ist ein Index auf ein Textfeld. Gesucht wird mit dem %-Zeichen und das bedeutet enthält Schlüsselwort.

Vorbedingung ist, daß ich aus alle wichtigen Feldern die Inhalte in einem Textfeld zusammenfasse.

Alle Daten in einem Textfeld

Die Arbeit erledigt
VollTextIndex_Mngr ("FillVollText";->[KUNDEN];->[KUNDEN]KD_FullTextIndex_T)
Ich übergebe dem VollTextIndex_Mngr den Auftrag "FillVollText" für die Tabelle [KUNDEN] und lasse den Volltext in das Feld [KUNDEN]KD_FullTextIndex_T schreiben. Das ist die Methode:

VollTextMngr

Die Methodenzeilen erläutert:

  • 1-74 Kommentare, Parameterübergabe und -Kontrolle (nicht gezeigt)
  • 75 - 115 für alle Felder einen Textwert erstellen und diesen im Zielfeld eintragen
  • 76 vor jedem Durchgang den Nutztext leer setzen
  • 78-79 Feld-Pointer erzeugen und den Feldnamen auslesen
  • 81-87 Nil-Pointer (sollte nicht vorkommen), das Zielfeld und einige Felder nach meiner Nomenklatur ausschließen
  • 88-108 Datentypen in Text wandeln
  • 111 Text dem Textfeld zuweisen und zw. den Feldinhalten einen Zeilenschalter einfügen
Das funktioniert überzeugend.

Die Suche beschränkt sich jetzt auf die Suche in dem einen Textfeld. Eine Lösung, die sich bisher mit einigen 10.000 Datensätzen bewährt hat. Setze ich die DBZ-Komponente in einer meiner Lösungen ein, sucht diese vorrangig in einem indizierten Textfeld, ehe sie auf die klassische mehrstufige Suche zurückfällt.

Die Anwender erwarten, daß sie alles finden, egal was sie eintippen. Der Kunde hat recht – nicht immer aber immer öfter?

DE_flag GB_flag

lieber auf deutsch

As simple as possible

find

The simplicity of the Google-homepage is part of their success, besides finding what you are looking for. Similar with iTunes, just one searchfield. Anything I'm looking for is found. My 4D-users love that one searchfield, too.

Up to V11 I searched several fields. Looking for addresses meant querying Names, street-addresses and accompanying fields. If there is nothing found I add the at-sign to the searchstring and if begins with has no success I try a contains-query. This was even in V2004 fast enough for most kinds of application. The users love it.

Since V12 my work is even simpler. Reason is fulltext-index, which is an indexed textfield. The search is contains keyword and uses the %-sign.

Before finding anything in a textfield, that textfield needs to contain the data to search for.

All data in one textfield

The work is done by
VollTextIndex_Mngr ("FillFullText";->[CUSTOMER];->[CUSTOMER]CUST_FullTextIndex_T)
I tell the method VollTextIndex_Mngr to "FillFullText" for table [CUSTOMER] and fill the result into field [CUSTOMER]CUST_FullTextIndex_T. Here is the method:

VollTextMngr

Method lines explained:

  • 1-74 comments, parameter-passing and -control (not shown)
  • 75 - 115 create a textrepresentation of every field and fill the textfield
  • 76 clear $useText for every cycle
  • 78-79 create a field-pointer and get the name of the field
  • 81-87 Nil-pointer (shouldn't happen), the destination-field and some fields according to my nomenclature are excluded
  • 88-108 convert other datatypes into alphanumeric
  • 111 add the text to the fulltextfield and add a return as a separation
Works as expected.

For me to only search in one textfield means less code and a better performance. That does work well for a couple of some 10.000s of records. My DBZ-component for V12 does a query against an indexed textfield first.

The users expect to find everything, no matter where the data is stored. Right they are!