Alex: Suchfunktionhilfe

Hi,

in meiner Datenbank moechte ich nun eine Suchfunktion einbauen. Das Prinzip habe ich mri scho ueberlegt, nur bei der Umsetzung haperts.

Also die Datenbank sieht folgendermaßen aus:

feld1a%%feld2a%%feld3a%%etc.
feld1b%%feld2b%%feld3b%%etc.

also in jeder Zeile 1 Datensatz mit verschiedenen Feldern, getrennt mit einem %%.

Jetzt moechte ich die Moeglichkeit geben, mehrere Suchbegriffe einzugeben (getrennt durch ein Leerzeichen) und Gross/Kleinschreibung sollen beachtet werden. Ausserdem soll man noch die Moeglichkeit haben, dass entweder 1 Suchbegriff oder alle, die eingegeben wurden, zum Auflisten (in der Ergebnisliste) reicht.

Danke fuer Eure Hilfe!!!

-Alex

  1. Jetzt moechte ich die Moeglichkeit geben, mehrere Suchbegriffe

    einzugeben (getrennt durch ein Leerzeichen)
    die einzelnen suchbegriffe erhälts du via split. so kannst du übrigens auch die felder aus dem datensatz extrahieren.

    Gross/Kleinschreibung sollen beachtet werden.

    beim suchen als letztes *KEIN* /i als option angeben (also /foo/ statt /foo/i).

    Ausserdem soll man noch die Moeglichkeit haben, dass entweder 1 Suchbegriff oder alle, die eingegeben wurden, zum Auflisten (in der Ergebnisliste) reicht.

    falls einer reicht, kannst du die suche ja beim ersten treffer für diesen datensatz abbrechen. ansonsten suchst du nach jedem suchbegriff in jedem datensatz.
    ronny

  2. Hi,

    Folgende Lösung ist mir dazu eingefallen:

    $Suchbegriffe="Str1 Str2   Str3";

    my(@SrchList) = split(/\s+/,$Suchbegriffe);

    $Srch = "(" . join("", @SrchList) . ")";

    foreach $Rec ( @records ) {
       $x="NichtGefunden";
       if ( $AlleMuessenGefundenWerden ) {
          BLOCKA: {
            BLOCKB: {
               foreach $_ (@SrchList) {
                  last BLOCKA if ( "axbxcx" !~ /$_/i );
               } #foreach
               $x="Gefunden";
            } # BLOCKB
          } # BLOCKA
          print STDOUT $Rec    if ( $x eq "AlleGefunden" );
       } else {
          $x="Gefunden"   if ( $Rec =~ /$Srch/i );
       }
       if ( $x eq "Gefunden" ) {
          print STDOUT $Rec    # ...oder was auch immer...
       }
    } # foreach

    Ich hab's zwar nur rudimentär getestet, aber vom Prinzip her funktioniert es. Außerdem werden hier nicht die einzelenen Felder aufgesplittet, was aber für Deinen Fall hier scheints sowieso nicht nötig ist.

    Manfred

    1. Da ist mir wohl ein Fehlerchen unterlaufen

      Statt

      last BLOCKA if ( "axbxcx" !~ /$_/i );

      muß es natürlich
                       last BLOCKA if ( $Rec != /$_/i );
      heißen.

      Manfred

  3. Hallo Alex,

    [...]

    Jetzt moechte ich die Moeglichkeit geben, mehrere Suchbegriffe einzugeben (getrennt durch ein Leerzeichen) und Gross/Kleinschreibung sollen beachtet werden. Ausserdem soll man noch die Moeglichkeit haben, dass entweder 1 Suchbegriff oder alle, die eingegeben wurden, zum Auflisten (in der Ergebnisliste) reicht.

    [...]

    Mein Vorschlag wäre, Deine Suchbegriffe beim Leerzeichen zu splitten, und für jedes Wort die Suche durchzuführen.
    Dann zählts Du für jeden Suchbegriffe mit, ob er gefunden wurde. Ist dies Zahl gleich der Anzahl der Suchbegriffe, hast Du ein AND, falls sie Null ist kein Suchergebnis, andernfalls entspricht es einer OR-Suche.

    $record = "blablabblub......";

    @keywords = split / /, $query;
    foreach $key (@keywords) {
      $match++ if $record =~ /$key/;
    }
    if ($match > 0 && $match <= scalar(@keywords) && $search eq "or") {
      push @ergebnis, $record;
    }
    elsif ($match == scalar(@keywords) && $search eq "and") {
      push @ergebnis, $record;
    }
    else { print "Kein Ergebnis"; }

    Mit entsprechenden Veränderungen kannst Du auch Deine Suchfunktionen auf "ganzes Wort", "caseinsensitiv",... erweitern.

    HtH und das das so funktioniert ;-) (hab`s nicht mehr getestet, aber die Idee dürfte stimmen :-)

    Gruß AlexBausW

    P.S.: Bereinigen, so daß es auch mit 'use strict' läuft, musst Du selber ;-)

  4. Hi,

    in meiner Datenbank moechte ich nun eine Suchfunktion einbauen.
    Das Prinzip habe ich mir scho ueberlegt, nur bei der Umsetzung haperts.

    was hältst Du davon, das Prinzip zu beschreiben, damit wir zur Umsetzung Stellung nehmen können?

    Also die Datenbank sieht folgendermaßen aus:
    feld1a%%feld2a%%feld3a%%etc.
    feld1b%%feld2b%%feld3b%%etc.
    also in jeder Zeile 1 Datensatz mit verschiedenen Feldern, getrennt mit einem %%.

    Das ist keine Datenbank. Es ist *vielleicht* eine Tabelle innerhalb einer Datenbank (welche dann ggf. nur aus einer einzigen Tabelle besteht).
    Haben Deine Zeilen konstant oder variabel viele Felder? (Bei konstant vielen Feldern wäre die Tabelle eventuell nicht besonders geschickt aufgebaut - aber auch bei variabel vielen Feldern ginge es ggf. besser.)
    Willst Du beim Match während der Suche nur innerhalb einzelner Felder oder auch feldübergreifend Treffer erzielen können? Ersteres ginge geschickt über Indexstrukturen, bei letzterem (wie bei der auf diesem Server verfügbaren Archivsuche) ist eine Volltextsuche erforderlich.

    Jetzt moechte ich die Moeglichkeit geben, mehrere Suchbegriffe einzugeben (getrennt durch ein Leerzeichen)

    Wohinein? In eine Suchmaske? Was genau soll die Angabe mehrerer Begriffe bewirken? (AND? OR? whatever?)

    und Gross/Kleinschreibung sollen beachtet werden.

    Hast Du die Möglichkeit dazu (was genau steht in Deinen Feldinhalten? Wie vergleicht Deine Datenbank Strings?)

    Ausserdem soll man noch die Moeglichkeit haben, dass entweder 1 Suchbegriff oder alle, die eingegeben wurden, zum Auflisten (in der Ergebnisliste) reicht.

    Das klingt so, als würdest Du hiermit OR und AND beschreiben wollen.
    Hast Du schon ein Konzept, wie das GUI für den Anwender aussehen soll (welche ja irgendwie angeben können muß, ob er OR oder AND haben will)?

    Und was genau soll in der Ergebnisliste stehen? Welche Information soll der Anwender als Ergebnis seiner Suche erhalten?

    Du siehst, die vollständige Spezifikation einer Suchmaschine geht nicht in drei Sätzen ...

    mfG - Michael

  5. Hallo Alex,

    Hi,

    in meiner Datenbank moechte ich nun eine Suchfunktion einbauen. Das Prinzip habe ich mri scho ueberlegt, nur bei der Umsetzung haperts.

    Also die Datenbank sieht folgendermaßen aus:

    feld1a%%feld2a%%feld3a%%etc.
    feld1b%%feld2b%%feld3b%%etc.

    also in jeder Zeile 1 Datensatz mit verschiedenen Feldern, getrennt mit einem %%.

    Jetzt moechte ich die Moeglichkeit geben, mehrere Suchbegriffe einzugeben (getrennt durch ein Leerzeichen) und Gross/Kleinschreibung sollen beachtet werden. Ausserdem soll man noch die Moeglichkeit haben, dass entweder 1 Suchbegriff oder alle, die eingegeben wurden, zum Auflisten (in der Ergebnisliste) reicht.

    Versuch' mal das:

    #!perl -w
    use strict;

    1 = alle muessen gefunden werden

    my $alle=1;

    Suchstring

    my $search = 'eins zwei drei';
    chomp $search;

    my $filename =  'pfad/zur/datei';

    Suchstring in Array,

    Da Usereingaben, Metazeichen in Literale wandeln

    my @search = map quotemeta, split / +/, $search;

    my @res;

    while (my $line= <DATA>) {

    # alle Suchwoerter in Zeile suchen  
    # wenn gefunden, 1 in @found, sonst nix	  
    

    my @found= map $line=~ m/$_/, @search;

    # falls was gefunden	  
    

    if (@found) {
      
      # nur in @res wenn alle gefunden
      if ($alle) { push @res,$line if $#found == $#search}
      
      # oder wenn mind. 1 gefunden
      else {push @res,$line}
    }
    }

    print @res;

    __DATA__
    eins%%zwei%%drei%%vier
    eins%%zwei%%drei
    eins%%zwei
    eins

    Danke fuer Eure Hilfe!!!

    -Alex

    Gruss
       Kai