Michael Schröpl: PerlSearch - Indexsuchmaschiene aber wie ?

Beitrag lesen

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