"Suchindex" von vielen Dateien anlegen


breytex

Mitglied
Hallo zusammen...
Habe da ein "Problem".

Ich soll eine Suche programmieren, die in einer ziemlich großen Ordnerstruktur von pdf-Dateien sucht. (ca 2 GB groß....)

Die PDF-Dateien liegen in vielen Unterverzeichnissen.
Beispiel:

pdfs/häuser/1.pdf
pdfs/häuser/2.pdf
pdfs/autos/1.pdf
pdfs/autos/2.pdf
pdfs/autos/rot/1.pdf
pdfs/autos/blau/2.pdf
pdfs/autos/blau/gestreift/2.pdf

Dies könnten beispielsweise Dateien aus dieser Ordnerstruktur sein.
Die Unterordner sind nicht "fest", d.H. es können neue hinzu kommen oder entfernt werden usw.

Ich benötige nun ein Script, welches alle diese Ordner durchgeht, und mir quasi einen SQL-Index liefert, in dem ich dann suchen kann.
Es soll also jeder Dateiname in die Spalte "name" und jeder Dateifad in die Spalte "Fad" überführt werden. Da es ja aber wie gesagt keine festen Ordner sind, und die Zahl der Dateien mächtig groß ist, bin ich da ein bisschen überfragt.

Das ganze soll hinterher eine art Job werden... D.H. die "Suchdatenbank" wird alle X Tage neu erstellt.

Hat da jemand einen Codeschnipsel für mich, der mir da weiterhelfen könnte?

lG
PS: Achja, würde diesen "Crawler" gerne mit PHP umsetzen ;-)
 

Flex

(aka Felix Jacobi)
[phpf]glob[/phpf] kann dir dabei helfen.

Die Größe der Dateien ist dabei völlig irrelevant, nur die Anzahl an Dateien könnte problematisch werden, wenn es wirklich viele sind.
Das müsste allerdings getestet werden.
 

breytex

Mitglied
darauf bin ich auch schon gestoßen.

Ich möchte ja nicht in der Ordnerstruktur als solches suchen, sondern mit einem "Crawler" einfach alle Ordner durchgehen, die Dateien in einen SQL-Index überspielen ( also nur Name und Fad der Datei ) um dann hinterher mit SQL suchen zu können.
 

Flex

(aka Felix Jacobi)
Ja, dafür ist [phpf]glob[/phpf] doch geeignet?

In einer Schleife iterierst du durch die Verzeichnisse und hast dann die Auswahl, ob du X Queries machst oder eben alles in ein massives Query zusammenfasst.
 

kuddeldaddeldu

Erfahrenes Mitglied
Hi,

schau bei [phpf]glob[/phpf] mal in die User Contributed Notes. Dort sind einige Vorschläge für eine rekursive glob()-Funktion zu finden. Was das Eintragen in die Datenbank angeht, würde ich keine Einzelqueries absetzen. Eine Alternative wäre noch, eine CSV-Datei zu erzeugen und per LOAD DATA INFILE in die DB zu schaufeln.

LG
 

breytex

Mitglied
habs jetzt so umgesetzt...
Funktioniert so, auch wenn es "schlecht gemacht" aussieht ;)
Die Variablität der Verzeichnistiefe habe ich nicht so richtig hinbekommen...
Naja.

PHP:
function indb($fad,$size){
	$s = explode("/", $fad);
	$count=count($s)-1;
	$name=$s[$count];
	$name=mkurltitle(replace_specialchars2($name));
	db_query("INSERT INTO `pdfs` (`name`,`fad`,`firma`,`ms`,`keywords`,`size`) VALUES ('".$name."','$fad','','','','$size')");
}

$i=0;
foreach (glob("*/*.pdf") as $filename) {
    indb($filename,filesize($filename));
    $i++;
}
foreach (glob("*/*/*.pdf") as $filename) {
    indb($filename,filesize($filename));
    $i++;
}
foreach (glob("*/*/*/*.pdf") as $filename) {
    indb($filename,filesize($filename));
    $i++;
}
foreach (glob("*/*/*/*/*.pdf") as $filename) {
    indb($filename,filesize($filename));
    $i++;
}
foreach (glob("*/*/*/*/*/*.pdf") as $filename) {
    indb($filename,filesize($filename));
    $i++;
}
echo "<b>$i</b>";
 

Flex

(aka Felix Jacobi)
Gut, du hast fast alle Fehler mitgenommen, die man machen konnte, aber damit können wir arbeiten ;)

1. Schau mal in den Kommentaren bei [phpf]glob[/phpf] und such nach eine rekursiven Version von glob().

2. Nicht x-hundert Queries, sondern ein Großes.
Sprich du baust ein Query auf und hängst die neuen Erkenntnisse immer weiter hinten ran.

Syntax dafür: http://dev.mysql.com/doc/refman/5.1/en/insert.html
 

Forum-Statistiken

Themen
272.356
Beiträge
1.558.615
Mitglieder
187.830
Neuestes Mitglied
hansmeiser