allegro-Homepagehttp://www.allegro-c.deallegro-C
BlueChyp
V27.2
BlueChyp
Neuer- und Verbesserungen

7. Mai 2007







Mehr zu den Themen:


 

Die Volltextsuche mit "Regulären Ausdrücken"

Beim Suchen im Text der Datensätze ist es ja oft so, daß man die genaue Schreibweise nicht kennt. Man sucht z.B. den Namen Meyer. Hm, vielleicht schreibt er sich aber Meier, Maier, Mayer, oder es fehlt gar das e vor dem r? Die Methode der sog. Regulären Ausdrücke (engl. regular expressions, kurz RegEx) erlaubt es dann, das Suchwort beispielsweise so einzugeben:

m[ae][iy]e*r

und dann findet man alle Schreibweisen auf einmal! allegro-Anwender können diese unter Programmierern beliebte Methode ab der V27 anwenden: Auf dem Menü "Finden" gibt es dafür den neuen Punkt "Volltextsuche". Abgelöst wird damit zugleich ein älteres DOS-Hilfsprogramm namens SRCH.EXE. Sowohl der Komfort der neuen Methode wie auch ihr Potential sind weit höher, die Geschwindigkeit der Suche nicht geringer. Auch der bisherige, noch unvollkommene FLEX für die Volltextsuche wird weit übertroffen: der neue ist gut 50fach schneller.

Hinweis: V14-Verweise werden berücksichtigt! Wer also z.B. in der DemoBank nach "tucholsky" sucht, findet auch Sätze, in denen _tucho steckt. (Beim DOS-Programm gab es dafür die Option -F.)

Zuerst aber ein paar einfache Beispiele, die alle an der DemoBank ausprobiert werden können und etwas ergeben. Für die meisten Fälle finden Sie hier schon ein passendes Muster. Für Experten gibt es aber noch allerhand trickreiche Besonderheiten, siehe unten. Am Ende sind auch noch Abbildungen zu sehen!

In grün sieht man, was jeweils einzugeben ist.

 

0. Man sucht ein ganz normales Wort, sagen wir "Bücher"

   buecher

   (Also immer Kleinschreibung, Umlaute und ß auflösen, dann wird jede Schreibweise gefunden) 

   Hier sehen Sie schon, daß die Zeichenfolge "buecher" auch als Bestandteil eines längeren Wortes

   gefunden wird - falls Sie das nicht erwartet hatten! (Siehe aber unten die Regeln 2 und 3.)

 

1. Man will mal schauen, ob die exakte Zeichenfolge  "Oesterreich" vorkommt (also mit Oe statt Ö)

   _Oesterreich

 

2. Es wird "Atomphysik" oder "Kernphysik" gesucht

   atomphysik / kernphysik (es darf auch beides vorkommen)

   goethe % shakespeare (nicht beide, aber einer von beiden)

 

3. "Shakespeare" und "Drama" sollen auftreten, aber nicht "Hamlet"

   shakespeare + drama - hamlet

   (Man kann bis zu 100 Suchwörter verknüpfen, Klammerung ist aber (noch) nicht möglich.)

     SEHR wichtig: Vor und hinter +, - und / immer genau ein Spatium setzen. 


4. In welchen Sätzen kommt "Herzogtum" als Ordnungshilfe vor, im ganzen Satz bzw. nur in #60

   <<herzogtum>>   bzw.  #60.*<<herzogtum>>

      (<< statt < und >> statt >, weil diese Zeichen sonst eine Sonderwirkung haben:)

SEHR wichtig: Wo man  .*  angibt, können beliebig viele andere Zeichen stehen. 

Der Punkt allein besagt, daß an seiner Stelle irgendein beliebiges Zeichen stehen kann.

 

5. Im Feld #76 soll eine Jahreszahl größer als 2000 stehen bzw. genau 2000

   #76 >2000   bzw.   #76 =2000

   (Die Zahl braucht dabei nicht am Anfang von #76 zu stehen, z.B. auch in Klammern)

   Anderes Beispiel: Datensätze, die zwischen 1.12.2006 und 15.1.2007 erfaßt wurden!

   #99n>20061130 + #99n<20070116

 

6. Her mit den alten Sachen über Shakespeare, vor 1920 erschienen!

   #40.shakesp + #76 <1920

      (Der . sagt: Shakespeare ist auch in #402 usw. zu suchen, nicht nur in #40

 

7. In einem der #81er Felder soll "Diss." vorkommen (auch "diss." möglich)

   _#81.*Diss\. / _#81.*diss\.

   Hier bedeutet  .*  "beliebiger Zwischenraum" und \. findet den Punkt als solchen

 

8. Im Datensatz soll irgendetwas nicht vorkommen:  (s.a. 3.)

   -#90              Es soll kein Feld #90 vorhanden sein (auch nicht #90a etc.)

   #30 - #31     ein #30er-Feld soll vorkommen, #31 (oder #31x) aber nicht

                             (auch #30. - #31. würde gehen, aber ein Maskierungspunkt am Ende ist unnötig)

   _-#77.*S\.    in keinem Feld #77 (also auch #77a etc.) soll die Zeichenfolge "S." auftreten

 

9. Im Unterfeld $p der Bestellkategorie #9DB soll ein Preis >20 EUR stehen

   _#9DB.*²p>20  

      (Der _ ist nötig, damit exakt nach #9DB gesucht wird, nicht #9Db oder #9db)

 

10. Und was bedeutet  m[ae][iy]e*rSicher haben Sie es schon erraten:

   Wo [ae] steht, kann entweder ein a oder ein e stehen, und

    e* heißt: hier kann ein e stehen oder nichts (oder mehrere e)

 

Alle diese Beispiele ergeben sich aus den allgemeinen Regeln, die nachfolgend aufgelistet sind:

  

Allgemeine Regeln für Reguläre Ausdrücke

Die Punkte 2. und 3. sind allegro-spezifisch modifiziert, 1. gibt es im gängigen Standard nicht,  15. bis 17. auch nicht!

Die Regeln lassen sich alle sinnvoll miteinander kombinieren.

Der gesamte Ausdruck darf bis zu 1000 Zeichen lang sein.

Angewendet wird ein Suchbefehl stets auf den momentanen Inhalt der "internen Variablen".

Ausgeführt wird die Suche durch den neuen FLEX-Befehl srx. Der Normalanwender braucht dies nicht zu wissen, er benutzt einfach die Funktion "Volltextsuche" im Menü "Finden". Dahinter steckt der FLEX ftr.flx, und darin der Befehl srx. (Für den Experten gibt es einen FLEX grep.flx, der Textdateien durchsuchen kann, z.B. die "Verlautbarungen".)

 

 1. Unterstrich an erster Position: Exaktheit

    _abc  bzw.  abc

    Exakte bzw. umcodierte Suche

    Setzt man einen _ vor den Suchbegriff, wird dieser exakt gesucht,

    d.h. mit Eingabe von  _Müll  findet man nur Müll, nicht Muell oder

    muell oder müll.

    Im Normalfall, also ohne den _, wird der Datentext umcodiert, der Suchbegriff

    selbst aber nicht! Man muß also  muell  eingeben, um Müll, Muell und

    muell und müll mit einer einzigen Suche zu finden.

    Man wird meistens umcodiert suchen wollen, deshalb fordert diese

    Variante kein Steuerzeichen. Wichtig: Dann nur Kleinbuchstaben

    ohne Akzente eingeben, Umlaute aufgelöst, ss statt ß!

    (Der _ hat nur in der ersten Position diese Wirkung, sonst keine.)

    Zur Umcodierung werden die p- oder q-Befehle in den Indexparametern

    verwendet, und zwar diejenigen, die A in a wandeln.

    Achtung: _ empfiehlt sich, wenn Sonderzeichen gesucht werden, die

             bei der Umcodierung verschwinden.

    Es gibt aber noch weitere Alternativen. Mehr dazu

    am Ende: Befehl  set xm

    Hinweis: SRCH.EXE arbeitete mit einer weniger flexiblen Tabelle namens s1.asp.

 

2. Zirkumflex auf erster Position: Feldanfang

    ^abc  findet  abc  nur, wenn es an einem Feldanfang steht.

    Dabei gilt der Anfang des Feldtextes, ohne die Kategorienummer.

    Also:  _^Shakesp  findet  #40 Shakespeare und #31 Shakespeare.

    Wenn aber der zu durchsuchende Text (der iV-Inhalt) nicht mit '#'

    beginnt, gilt das erste Zeichen als Textanfang. 

    Bei der grep-Suche in Textdateien ist dies der Zeilenanfang.

 

3. Dollar an letzter Position: Feldende

    abc$  findet  abc  nur, wenn es am Ende eines Feldes steht.

    Wenn der zu durchsuchende Text (der iV-Inhalt) nicht mit '#'

    beginnt, gilt nur das Ende des gesamten iV-Textes.

    Bei der grep-Suche in Textdateien ist dies das Zeilenende.

 

 4. Punkt ist Joker (engl. "wildcard")

    AB.D  findet jedes ABxD, mit beliebigem Zeichen x

    Mehrere Punkte innerhalb eines Suchbegriffs möglich, jeder Punkt

    steht dann für genau ein Zeichen.

 

 5. Stern: Keins, eins oder mehrere

    ABc*D  findet ABD, ABcD, ABccD, ABcccD ... (d.h. c darf auch ganz fehlen)

 

 6. PunktStern: Binnentrunkierung (Kombination aus 4 und 5)

    AB.*CD  findet  ABxyzCD  mit beliebiger Folge xyz, aber im selben

       Datenfeld, nicht irgendwo weiter hinten im Datensatz!

       Das entspricht  AB,CD  im Programm SRCH

 

 7. Plus: wie Stern, aber mindestens ein Vorkommnis notwendig

    ABx+D  findet ABxD, ABxxD, ...  (d.h. mind. ein x muß vorkommen)

 

 8. Eckige Klammern: Variantensuche

    AB[pq]Z   findet  ABpZ und ABqZ

    AB[c-f]Z  findet  ABcZ, ABdZ, ABeZ, ABfZ

    Die Angabe [c-f] deutet also an, daß eines der Zeichen im

    Bereich c-f an der Stelle vorkommen muß.

    [^c-f] bedeutet Negation, d.h. Zeichen c-f sollen an der Stelle

    nicht auftreten

    Eine Angabe [c-fp-y] verlangt, daß ein Zeichen aus dem Bereich

    c-f oder p-y vorkommt.

    Beispiel:  ele[ck]tri  findet electri und elektri

 

 9. Kombinationen [...]* und  [...]+

    * und + können auch hinter ] auftreten und beziehen sich dann auf

    die in [...] angegebenen Zeichen, d.h.

    AB[c-f]*XY  findet z.B.  ABXY, ABcXY, ABdXY, ABceXY, ABcdcdfXY, etc

    AB[c-f]+XY  findet aber ABXY nicht, nur die anderen wie bei *

    Beispiele:  theat[er]+  findet Theater und theatre

                i[sz]abel+a findet Isabella, Izabella, Izabela, Isabela

 

10. Steuerzeichen finden : Dabei hilft \

    AB\xCD   findet ABxCD

    Das Zeichen x soll vorkommen. Man setzt \ vor solche Zeichen,

    die sonst eine Steuerfunktion haben,  also [ ] \ < > + . * $ ^

    sowie auf der allerersten Position die Zeichen _ und -

    Sonderfall: Die Zeichen < bzw. > findet man mit << bzw. >>

                (wegen 11., 12. und 15.)

    Beispiele: mit \. findet man einen echten Punkt

               mit <<dresden>> findet man <Dresden> (Ordnungshilfe)

 

11. \< : Wortanfang suchen

    \<abc   findet abc, aber nur wenn es an einem Wortanfang steht.

    Ein "Wort" beginnt mit Buchstabe oder Ziffer, d.h. es geht

    irgendein anderes Zeichen oder kein Zeichen voran, z.B. auch -

 

12. \> : Wortende suchen

    abc\>   findet abc, aber nur wenn es an einem Wortende steht.

    Hinter c soll also im Text ein Sonderzeichen oder nichts folgen.

    10 und 11 sind kombinierbar, damit ist exakte Wortsuche möglich.

 

13. \(...\) : Wiederholung eines Ausdrucks

    \(AB\)xyz\1   findet ABxyzAB

    \(AB\).*\1    findet AB...AB

                  mit beliebiger Zeichenfolge zwischen den beiden AB.

    Es können weitere Ausdrücke \(...\) auftreten, die danach mit \2,

    \3 etc. im selben Gesamtausdruck wiederholt werden können.

 

14. Sonderwerte

    Mit \w innerhalb jedes reg.Ausdr. kann man Positionen markieren, an

    denen ein Buchstabe vorkommen soll:

    \w  sucht nach einem beliebigen Buchstaben oder Unterstrich

        #90.*[123]\w     bedeutet:

        Kommt in #90 eine Ziffer 1,2 oder 3 und dann ein Buchstabe vor?

    \s  sucht nach einem blank (Spatium)  Meistens kann man einfach ein

        normales Spatium eingeben! Am Ende des Suchbegriffs aber nicht,

        es würde bei der Zwischenspeicherung in #u!! verschwinden.

        Nützlich, wenn man z.B. die Zeichenfolge " + " sucht! Dann

        also \s+\s verwenden.

 

15. Größer/Kleiner/Gleich-Suche

    Hiermit wird ein Zahlenvergleich ausgeführt. (Von-Bis-Suche s. 17.)

    abc>nnn

    findet zuerst abc und vergleicht dann die erste, im selben Feld

    hinter abc folgende Zahl mit nnn. Treffer, wenn diese

    größer als nnn ist.

    Wenn abc mehrfach vorkommt, werden alle Vorkommnisse geprueft!

    Beispiel:   #77 >100

                 findet Eintraege, wo in #77 eine Zahl >100 steht

                #77 <100

                 findet Eintraege, wo in #77 eine Zahl <100 steht

                #76 =2000

                 findet Eintraege, wo in #76 die Zahl 2000 steht

    Hinweis: Der Zahl dürfen andere Zeichen vorangehen! Der Vergleich

    beginnt bei der ersten Ziffer bzw. Minuszeichen.

    Achtung: Würde man hier schreiben:  #77>100, dann würde auch ein

             Feld #77a etc. geprüft werden

    Tip:  _ anwenden, um Probleme mit dem Punkt zu verhüten, also

          eingeben:  _#77 >50  statt  #77 >50, bes. bei Geldbeträgen!

    Beispiel: Preisangaben stehen in #9DB$p. Um alle Bestellsätze mit

              Preis >20 EUR zu finden, kann man geben:

              _#9DB.*²p>20  

    Alpha-Vergleich: Wenn hinter > bzw. < keine Zahl, sondern eine
        Buchstabenfolge angegeben wird, findet ein alphabetischer Vergleich statt.

        Beispiel:  _#74 >A + #74 <D

              findet Einträge, wo #74 mit A,B oder C beginnt

16. Negative Suche

    Wenn man ein Minuszeichen an den Anfang eines Ausdrucks setzt,

    und zwar ohne ein Leerzeichen dahinter!,

    wird alles gefunden, was NICHT dem Ausdruck entspricht.

    Hinweis: _ muß vor - stehen

 

17. Logische Kombinationen, Von-Bis-Suche

    Reg. Ausdrücke haben "von Natur aus" keinen Mechanismus für

    boolesche Kombinationsbefehle. Eine Lösung wurde programmiert.

    Damit kann man mehrere nach den Regeln 1-16 gebildete Ausdrücke

    A1, A2 ... logisch miteinander kombinieren, bis zu 100 Stück:

    A1 / A2 + A3 - A4 % A5 ...

    Die Abarbeitung erfolgt von links nach rechts:

    Am Anfang: Status S=0

    A1 richtig: S=1

     / A2 : Wenn A2 richtig: S=1

     + A3 : Wenn A3 falsch: S=0

     - A4 : Wenn A4 richtig: S=0

       und sogar noch das "exklusive ODER":
     % A5 : Wenn A5 richtig und S=0, oder A5 falsch und S=1, dann S=1, sonst S=0
    
...

     Ende: S ist das Ergebnis

    Achtung: Leerzeichen vor und hinter dem Operator! (Anders als beim

    DOS-Programm SRCH, wo das nicht klappt.)

    Sonderfall: Von-Bis-Suche. Diese ist als Kombination von Größer- und
      Kleiner-Suche möglich:  
   
  #76 >1989 + #76 <2000  findet die Erscheinungsjahre 1990 bis 1999
   
Klammerung geht (noch) nicht! Allerdings kann man durch geschickte

    Nutzung der [..]-Optionen sowie + * . auf manche Oder-Ausdrücke

    verzichten, die sonst nicht ohne Klammerung zu machen wären!

 

Andere als die hier beschriebenen Sonderzeichen haben keine Sonderwirkung, d.h. sie dürfen in Suchbegriffen vorkommen - vorausgesetzt, sie werden in den Indexparametern nicht ausgefiltert! Dann findet man sie nur mit einem _ am Anfang des Ausdrucks.


Und wie ist das alles realisiert?

Die Funktion "Volltextsuche" ist nicht fix und fertig fest ins Programm eingebaut - das erscheint nur so! Sondern es wurde eine neue Funktion namens srx in der Makrosprache FLEX geschaffen. Diese Funktion durchsucht den Text, der in der sog. "internen Variablen" steht mithilfe des gewünschten regulären Ausdrucks. Damit konnte ein FLEX namens ftr.flx geschrieben werden, und dieser führt die Volltextsuche in der gesamten Datenbank durch. Es konnte aber auch schon z.B. ein FLEX namens grep.flx geschaffen werden, und der durchsucht Textdateien, ebenfalls mit der RegEx-Technik. Viele weitere Anwendungen sind denkbar, d.h. kundige Anwender können sich eigene, mächtige Suchfunktionen damit erstellen. FLEX-Programmierer können dazu auch auf ein Unterprogramm :ftr zurückgreifen, d.h. dieses in einen eigenen FLEX hineinnehmen! Damit kann eine Volltext-Durchsuchung der Gesamtbank mit ganz wenigen Befehlen in jeden eigenen FLEX eingebaut werden, etwa so:

#u!!<regulaerer Ausdruck>
perf ftr      // Unterprog aufrufen (ist in i-ftr.flx)
sho list      // Erg.Menge anzeigen
end
include i-ftr.flx

Der Normalanwender kann aber sofort, ohne dieses gesamte Wissen, ohne eine eigene FLEX-Zeile zu schreiben, mit dem Menüpunkt "Volltextsuche" loslegen, und zwar bei jeder Datenbank! Im Grunde ist die normale Suche sehr ähnlich wie beim DOS-Programm. Was dort schon gut war, wurde übernommen, aber verbessert und erweitert. Bis auf die Klammerung, das ist ein noch ungelöstes Problem.

Ach so, die Schiller-Räuber-Suche? Die geht nicht. Aber SRCH konnte sie auch nicht! Sie bleibt der Registersuche vorbehalten.



Menü:

Menü Volltextsuche


.. und was dann kommt:

Volltextsuche Eingabe des regulaeren Ausdrucks

 

 

 


http://www.allegro-c.de/bluechyp/



Bernhard Eversberg, UB Braunschweig 2007-05-03