Suche
Janine
- php
0 Siechfred0 Marian0 Robert Bienert0 Janine
Mojn
ich möchte eine kleine Suche auf meiner Seite anbieten
ich weiß nur nicht so recht, wo ich die Daten abspeicher, bzw. wie ich sie abspeicher
die Website besteht aus HTML-Dateien
die Suche soll mittels PHP realisiert werden
es würde mir ausreichen, wenn ich ein paar Suchworte pro Seite definieren kann, eine Volltextsuche wäre nicht schlecht, aber nicht notwenig
Die Texte sind alle schon in einer Datenbank
aus diesen Texten wird dann die Website (in mehreren Sprachen) erstellt
die Website wird als normale HTML-Datei abgespeichert, da sich selten etwas am Content ändert
wie würdet ihr die Suche realisieren
MySQL, SQLite, Text-Datei?
danke für's lesen
es ist ein Apache Webserver mit MySQL 4 und Wahlweise PHP 4.4.1 oder PHP 5.0.5
Janine
Tag Janine.
ich möchte eine kleine Suche auf meiner Seite anbieten
Ein paar Tipps und Denkanstöße findest du hier:
http://www.php-faq.de/q/q-scripte-volltextsuche.html
Siechfred
Hi Janine,
ich möchte eine kleine Suche auf meiner Seite anbieten
ich weiß nur nicht so recht, wo ich die Daten abspeicher, bzw. wie ich sie abspeicherdie Website besteht aus HTML-Dateien
die Suche soll mittels PHP realisiert werden
Die Suche von Google reicht nicht?
Die Texte sind alle schon in einer Datenbank
aus diesen Texten wird dann die Website (in mehreren Sprachen) erstellt
die Website wird als normale HTML-Datei abgespeichert, da sich selten etwas am Content ändert
Wenn die Texte schon in der Datenbank sind, kannst du ja auch dort in ihnen suchen.
Gruß, Marian
Mojn
ich möchte eine kleine Suche auf meiner Seite anbieten
ich weiß nur nicht so recht, wo ich die Daten abspeicher, bzw. wie ich sie abspeicherdie Website besteht aus HTML-Dateien
die Suche soll mittels PHP realisiert werdenDie Suche von Google reicht nicht?
dafür müßte Google erstmal die komplette Website einspidern ;-)
Die Texte sind alle schon in einer Datenbank
aus diesen Texten wird dann die Website (in mehreren Sprachen) erstellt
die Website wird als normale HTML-Datei abgespeichert, da sich selten etwas am Content ändertWenn die Texte schon in der Datenbank sind, kannst du ja auch dort in ihnen suchen.
wäre machtbar, aber ich wollte/möchte dafür eine neue Datenbank/Textdatei erstellen
Grund: Die Website läuft nachher auf ein anderen Server, als wo sie erzeugt wird
die komplette Datenbank möchte ich auf den anderen Server nicht importieren
Janine
Hi Janine,
Die Texte sind alle schon in einer Datenbank
Wenn die Texte schon in der Datenbank sind, kannst du ja auch dort in ihnen suchen.
wäre machtbar, aber ich wollte/möchte dafür eine neue Datenbank/Textdatei erstellen
Grund: Die Website läuft nachher auf ein anderen Server, als wo sie erzeugt wird
die komplette Datenbank möchte ich auf den anderen Server nicht importieren
Ja dann mach halt eine Datenbank mit Keywords.
Ich würde es so machen: eine Spalte mit dem Dateinamen und eine mit ein paar Keywords. Die kannst du dann mittels LIKE abfragen.
Oder fragst mal beim Autor z.B. der Selfsuche nach, wie er es gemacht hat: http://suche.de.selfhtml.org/#impressum
Gruß, Marian
Moin Janine!
die Website besteht aus HTML-Dateien
die Suche soll mittels PHP realisiert werdenes würde mir ausreichen, wenn ich ein paar Suchworte pro Seite definieren kann, eine Volltextsuche wäre nicht schlecht, aber nicht notwenig
Enthalten denn deine HTML-Seiten keine Stichworte oder eine Kurzbeschreibung, beides als meta-Tag? Dann könntest du den Suchindex mit Hilfe eines Scriptes zusammenstellen lassen, was lediglich den head der Dateien auf die genannten Meta-Angaben parst.
Die Texte sind alle schon in einer Datenbank
aus diesen Texten wird dann die Website (in mehreren Sprachen) erstellt
die Website wird als normale HTML-Datei abgespeichert, da sich selten etwas am Content ändert
Aus diesem Grund würde ich empfehlen, auch den Suchindex in einer eher statischen Variante abzuspeichern, d.h. als Datei, damit nicht bei jeder Suchabfrage erst einmal die Datenbank-Engine „angeworfen“ werden muss. Da die Texte aus einer Datenbank stammen, könntest du dort auch noch die Suchbegriffe abspeichern und daraus den Index generieren.
wie würdet ihr die Suche realisieren
MySQL, SQLite, Text-Datei?
Hm, SQLite ist natürlich auch schön klein und schlank, aber MySQL halte ich in diesem Fall für ein bisschen überdimensioniert.
Viele Grüße,
Robert
Mojn Robert,
die Website wird als normale HTML-Datei abgespeichert, da sich selten etwas am Content ändert
Aus diesem Grund würde ich empfehlen, auch den Suchindex in einer eher statischen Variante abzuspeichern, d.h. als Datei, damit nicht bei jeder Suchabfrage erst einmal die Datenbank-Engine „angeworfen“ werden muss. Da die Texte aus einer Datenbank stammen, könntest du dort auch noch die Suchbegriffe abspeichern und daraus den Index generieren.
wie sollte ich am besten die Daten dadrin abspeichern?
1. ein Array, wo die Indexe das Suchwort sind und die Werte den Pfad zur Seite enthalten?
z.B.
suche = array();
suche['xyz'] = '/ordner1/datei1.htm;/ordner2/datei2.htm;/datei3.htm';
suche['zyx'] = '/datei4.htm';
2. als *.ini-Datei?
3. oder eien andere Möglichkeit?
wie würdet ihr die Suche realisieren
MySQL, SQLite, Text-Datei?
Hm, SQLite ist natürlich auch schön klein und schlank, aber MySQL halte ich in diesem Fall für ein bisschen überdimensioniert.
unterstützt SQLite eigentlich die Volltextsuche?
ich werde auch sqlite.org nicht ganz schlau
der Vorteil von SQLite gegenüber MySQL wäre, dass ich die Datenbank einfach mit per FTP hochladen könnte
Janine
Hallo Janine!
[…] Suchindex […]
wie sollte ich am besten die Daten dadrin abspeichern?
- ein Array, wo die Indexe das Suchwort sind und die Werte den Pfad zur Seite enthalten?
z.B.
$suche = array();
$suche['xyz'] = '/ordner1/datei1.htm;/ordner2/datei2.htm;/datei3.htm';
$suche['zyx'] = '/datei4.htm';
Bei dieser Lösung empfehle ich, den Suchindex in eine separate Datei zu schreiben und diese im Suchscript einzubinden. Der Vorteil daran ist, dass die Suche im Index sehr einfach zu bewerkstelligen ist, man muss sich z.B. nicht ein Dateiformat erfinden und dafür einen Parser schreiben:
~~~php
if ([link:http://www.php.net/manual/function.array-key-exists.php@title=array_key_exists]($_REQUEST['suchbegriff'], $suche))
echo 'Ergebnis: <a href="' .
[link:http://www.php.net/manual/function.htmlspecialchars.php@title=htmlspecialchars]($suche[suchbegriff]) . '">' .
htmlspecialchars($suche[suchbegriff]) . '</a>';
Allerdings hat dein Ansatz oben den (kleinen) Nachteil, dass der Wert zu einem bestimmten Schlüssel im Grunde eine Art serialisiertes Array darstellt, was passiert z.B., wenn eine Datei ein ';' im Namen trägt? Da wäre so etwas praktikabler:
$suche['xyz'] = array('/ordner1/datei1.htm', '/ordner2/datei2.htm',
'/datei3.htm');
// bzw.
$suche['xyz'][] = '/ordner1/datei1.htm';
// …
$suche['xyz'][] = '/ordner2/datei2.htm';
// …
$suche['xyz'][] = '/datei3.htm');
Ein weiterer Nachteil dieser Lösung ist, dass der komplette Suchindex von PHP in den Speicher geladen wird, obwohl sehr wahrscheinlich nur ein geringer Teil seines Inhaltes benötigt wird.
- als *.ini-Datei?
Analog zu obigem, also z.B. in dieser Art:
xyz=/ordner1/datei1.htm;/ordner2/datei2.htm;/datei3.htm
xyz=/ordner1/datei1.htm
xyz=/ordner2/datei2.htm
xyz=/datei3.htm
Falls du parse_ini_file verwenden möchtest, achte darauf, dass die Dateinamen einige Zeichen nicht enthalten dürfen. Der obere Ansatz in meinem Beispiel enthielte dann nur /ordner1/datei1.htm, weil das ';' als Kommentarzeichen benutzt wird. Allerdings wird auch hierbei – unter Verwendung von parse_ini_file – der komplette Index in den Speicher geladen. Da wäre es durchaus sinnvoller, den Index zeilenweise zu lesen, da du dann auch in jeder Zeile entscheiden kannst, ob sie relevant ist:
if (($fh = [link:http://www.php.net/manual/function.fopen.php@title=fopen]('/pfad/zum/suchindex', 'r')) === FALSE)
die 'Suche außer Betrieb';
$line = [link:http://www.php.net/manual/function.fgets.php@title=fgets]($fh);
// diese Variablen brauchen wir bei jedem Schleifendurchlauf:
$del = 0; // Position des Trennzeichens '='
$key = ''; // Schlüssel
$val = ''; // passender Wert
while ($line !== FALSE) {
if (! ($line{0} == '#' or $line{0} == ';'
/* oder weitere Kommentarzeichen */ ))
{
if (($del = [link:http://www.php.net/manual/function.strpos.php@title=strpos]($line, '=')) !== FALSE) {
if (($key = [link:http://www.php.net/manual/function.substr.php@title=substr]($line, 0, $del)) == $_REQUEST['suchbegriff'])
{
$val = htmlspecialchars(substr($line, $del+1));
echo 'Ergebnis für <b>' .
htmlspecialchars($_REQUEST['suchbegriff']) .
"</b>: <a href=\"$val\">$val</a>";
}
}
}
$line = fgets($fh);
}
[link:http://www.php.net/manual/function.fclose.php@title=fclose]($fh);
- oder eien andere Möglichkeit?
Naja, sonst fällt mir nur noch die Verwendung einer Datenbank ein.
Hm, SQLite ist natürlich auch schön klein und schlank, aber MySQL halte ich in diesem Fall für ein bisschen überdimensioniert.
unterstützt SQLite eigentlich die Volltextsuche?
ich werde auch sqlite.org nicht ganz schlau
Oh, gute Frage. In der SQLite-Dokumentation des Befehls SELECT ist leider keine Rede von LIKE, damit wäre eine Volltextsuche sehr einfach (aber nicht unbedingt performant) möglich:
SELECT Datei FROM Suchindex WHERE stichwort LIKE '%SuchBegriff%'
wobei SuchBegriff dort der eingefügte Suchbegriff ist (Escaping nicht vergessen).
der Vorteil von SQLite gegenüber MySQL wäre, dass ich die Datenbank einfach mit per FTP hochladen könnte
So sieht es aus. Ich habe mir mal die Seite http://www.sqlite.org/ angeschaut und festgestellt, dass diese Datenbank-Engine richtig schick ist.
Viele Grüße,
Robert