Torwächter: PerlSearch - Indexsuchmaschiene aber wie ?

Hallo zusammen,
mal wieder brauch ich eure Hilfe:

Ich möchte eine Suchmaschiene aufbauen, die eine Datei (seek.db) durchsuchen soll.

(Seek.db)
...
Name1|Beschr1|Link1|Keya|...|Keyj
Name2|Beschr2|Link2|Keya|...|Keyj
Name3|Beschr3|Link3|Keya|...|Keyj
Name4|Beschr4|Link4|Keya|...|Keyj
...

Nun soll das Script die Keys nach der Eingabe durchsuchen und (jetzt kommts) bei totaler Übereinstimmung oben, bei enthalten weiter unten.

Aber wie mach ich das ?
Habs schon mit foreach versucht, aber das listet mir immer:
stimmt1
enthalten1
stimmt2
enthalten2

Kann mir vielleicht jemand helfen ?

Viele Grüße
Torwächter

  1. Hoi,

    (Seek.db)
    ...
    Name1|Beschr1|Link1|Keya|...|Keyj
    Name2|Beschr2|Link2|Keya|...|Keyj
    Name3|Beschr3|Link3|Keya|...|Keyj
    Name4|Beschr4|Link4|Keya|...|Keyj
    ...

    Nun soll das Script die Keys nach der Eingabe durchsuchen und
    (jetzt kommts) bei totaler Übereinstimmung oben, bei enthalten
    weiter unten.

    Aber wie mach ich das ?
    Habs schon mit foreach versucht, aber das listet mir immer:
    stimmt1
    enthalten1
    stimmt2
    enthalten2

    Kann mir vielleicht jemand helfen ?

    Sicher nicht, solange du keinen Code postest. Ich zumindest habe
    nicht verstanden, was fuer ein Problem du hast.

    Gruesse,
     CK

    1. der Code ist ca . so (hab ihn gerade nicht zur Hand)

      open Datei
      @Xtt = read
      Close

      foreach $zeile(@Xtt)
      (...keya,...,keyj) = (split "|")
      if (eingabe eq "keya")
      {print "treffer"}
      .
      .
      .
      elsif (eingabe eq "keyz")
      {print "treffer"}

      Nun möchte ich aber auch haben, das "text enthalten" Keys angezeigt werden. Ich denke damit:

      if(eingabe =~ /"keya"/i)
      {print "enthalten"}
      .
      .
      .

      leider sucht aber das foreach so:

      treffer
      enthalten
      treffer2
      .
      .
      .

      jetzt dachte ich, kann mir vielleicht jemand sagen, was ich anstelle dieser blöden foreachschleife benutzen kann.

      Viele Grüße
      Torwächter

      1. Mir ist eingefallen, wie es mit einem Satz umschrieben werden könnte :)

        Das Suchergebnis nach übereinstimmung mit dem Suchwort sortieren (z.B. 100% oben 1% unten)

        Viele Grüße
        Torwächter

        1. Hi,

          Mir ist eingefallen, wie es mit einem Satz umschrieben werden könnte :)

          Aah - das hilft!

          Das Suchergebnis nach übereinstimmung mit dem Suchwort sortieren
          (z.B. 100% oben 1% unten)

          Du willst also eine ranking-Funktion verwenden. Na, sag das doch gleich. ;-)

          Im Prinzip würde ich das in zwei Schritten tun:

          1. Definiere Dir eine Funktion, welche als Ergebnis eines Vergleichs eines
             Suchsbegriffs mit einer Zeile einen Zahlenwert liefert. Was "100%" be-
             deutet, das zu definieren ist Deine Aufgabe - laß Deiner Phantasie freien
             Raum.
          2. Mache Dein normales foreach, aber erst mal nur zum Berechnen der Tref-
             fer, nicht auch zum Ausgeben. Rufe dazu jeweils zum Vergleichen Deine
             Funktion auf. Falls diese Funktion ein Ergebnis 0 liefert (das wäre
             "keine Übereinstimmung", ignoriere die Zeile; andernfalls schreibe das,
             was Du später über die Zeile wissen willst, als Wert in einen Hash, den
             Du mit einem Schlüssel (siehe unten) adressierst:
                if (my $ranking = ranking_value ($search_term, $fields))
                   { $hash { key_generator($ranking) } = selected_fields ($fields); }
             Dieser Schlüssel wird es sein, nach dem Du später mit
                for my $this_key (sort keys %hash)
                    { ausgabe ($hash {$this_key}); }
             die Trefferanzeige erledigen wirst. Du mußt also sämtliche Treffer in
             diesem Hash zwischenspeichern - das wird ggf. einiges an RAM kosten.
             Dein Schlüssel muß zwei Eigenschaften erfüllen:
             a) er muß sich in der von Dir gewünschten Art und Weise sortieren lassen
                (ggf. kannst Du im obigen Code eine eigene Sortier-Funktion verwenden);
             b) er muß eindeutig sein - auch dann, wenn Du zwei Treffer mit demselben
                Ranking-Wert hast! (Andernfalls überschreibt der zweite Treffer näm-
                lich den ersten in Deinem Hash, und der ist dann futsch.)
             Letzteres löse ich üblicherweise dadurch, daß ich einen Schlüssel als
             integer-Zahl so zusammenbaue, daß der Präfix das ranking und der Postfix
             einen Tie-Breaker, also einen pro Treffer definitiv eindeutigen Wert,
             enthält. Ein Beispiel dafür wäre:
                $this_key = sprintf ("%10d-%10d", $ranking, $tie_breaker++);
             wobei der Tie-Breaker einfach pro Anwendung um 1 erhöht wird. (Das ist
             zwar ein bißchen Platzverschwendung, aber darüber mache ich mir wenig
             Gedanken, wenn der Inhalt von $hash{$this_key} signifikant länger ist
             als 20 Bytes.)

          Viele Grüße
                Michael

  2. hi!

    Ich möchte eine Suchmaschiene aufbauen, die eine Datei (seek.db)
    durchsuchen soll.

    Ihr bringt mich noch ins Grab: das Wort heißt "Maschine", ohne ein
    verdammtes "ie"!

    Dieses Posting war notwendig für mein persönliches Wohlempfinden. Ich
    bitte, das zu entschuldigen... ;)

    bye, Frank!

    ps. Mir erschien das hier eine passende Stelle zur Erinnerung:
    "Standard", nicht "Standart"... :)

    1. Hi Frank,

      Dieses Posting war notwendig für mein persönliches Wohlempfinden. Ich
      bitte, das zu entschuldigen... ;)

      Gesundheit! ;-)

      Ihr bringt mich noch ins Grab: das Wort heißt "Maschine", ohne ein
      verdammtes "ie"!
      ps. Mir erschien das hier eine passende Stelle zur Erinnerung:
      "Standard", nicht "Standart"... :)

      Das Hauptproblem ist ja nicht mal, daß solche Fragesteller sich durch
      offensichtliche Nichtbeherrschung elementarer sprachlicher Mittel bei
      einigen Antwortern gleich unbeliebt machen.

      Aber wie soll so jemand in einer Suchmaschine eines der vielen Dokumente
      finden, die sein Problem behandeln würden?
      "such.pl" ist kein Micro$oft-Produkt mit DAUs als Zielgruppe ...

      Viele Grüße
            Michael
      (der gerade darüber nachdenkt, wie sehr Micro$oft mit seiner "fehler-
       toleranten" Software die Benutzer dazu trainiert, das Gehirn auszu-
       schalten, bevor sie hier im Forum Fragen stellen ... hallo, Bio?)