PerlSearch - Indexsuchmaschiene aber wie ?
Torwächter
- perl
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
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
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
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
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
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"... :)
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?)