php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Wie geht das mit ner Suchmaschine


 
kressevadder
09-08-2003, 18:31 
 
hab in der Suche nix gefunden.

Mich interressiert eigentlich ganz allgemein wie das mit Suchmaschienen geht.

ich hab z.B. forenbeiträge in ner Datenbank. Jetzt kann ich natürlich mit LIKE die Beiträge etc. durchsuchen und anzeigen. Sowas kommt allerdings bestimmt sehr schnell an seine Grenzen.

Jetzt hab ich mir überlegt, alle Wörter aus dem geposteten Text zu filtern, für jedes neu gefundene Wort wird ein neuer Datensatz angelegt, ist das wort schon in der tabelle, wird die id des beitrags in das zugehörige Feld eingefügt.

Mit der Zeit müsste so eine Tabelle entstehen, in der so ziemlich alle Wöter drinstehn und in welchen posts sie vorkommen. Muss also nur noch das wort aus der tabelle filtern und hab auf einen Rutsch ne liste wo das Wort vorkommt.

Hat jemand Ahnung von sowas, ich möchte nicht dumm sterben?

 
Titus
10-08-2003, 12:03 
 
Vorweg:
Ganze Wörter kannst du auch mit einem FULLTEXT-Index und MATCH ... AGAINST (http://www.mysql.de/doc/de/Fulltext_Search.html) finden.
Für das Finden von Teilwörtern gibt es momentan leider nur LIKE, aber das nimmt bei umfangreichen Tabellen so viele Resourcen in Anspruch, dass ohne weiteres der Server abschmieren kann.

Um deine Idee zu verwirklichen, brauchst du mindestens eine zusätzliche Tabelle:create table suchbegriff
(
WORT varchar(255),
FK (Typ = Primärkey der Text-Tabelle),
index (WORT),
index (FK),
unique (WORT, FK)
)Wenn ein Suchbegriff nicht gefunden wird, fügst du einen Datensatz mit FK=0 ein.

Text einfügen / bearbeiten:select distinct WORT, max(FK), count(*) from suchbegriff
while (list($wort, $maxfk, $anzahl) = mysql_fetch_row(...))
{
if ($wort im Text enthalten)
{
if (0==$maxfk) // bisher 0-Datensatz: FK ändern
update suchbegriff set FK=$textid where WORT='$wort'
else // sonst: neue Fundstelle einfügen
insert into suchbegriff (WORT, FK) values '$wort', $textid;
/* wenn das fehlschlägt, ist der schon gespeichert */
}
elseif (1==$anzahl)
{
if ($maxfk==$textid) // einziges Vorkommen war aktueller Text
update suchbegriff set FK=0 where WORT='$wort'
}
else // es gibt noch andere Vorkommen
delete from suchbegriff where FK=$textid and WORT='$wort'
}Suche:select FK from suchbegriff where WORT='$wort'
if (mysql_num_rows(...)) // Suchwort schon gespeichert
{
$gefunden_ids = array();
while (list($id) = mysql_fetch_row(...))
$gefunden_ids[] = $id;
if (0==$gefunden_ids[0])
echo 'schon mal gesucht; nicht vorhanden';
else
echo 'Suchbegriff schon gespeichert in ',
implode(', ', $gefunden_ids);
}
else
{
normale Suche in allen Datensätzen:
if (gefunden)
insert into suchwort (WORD, FK) values ('$wort', $textid)
if(nirgends gefunden)
insert into suchwort (WORD, FK) values ('$wort', 0)
}

 
kressevadder
10-08-2003, 12:44 
 
Das nenn ich mal ne genaue Antwort. Ich hab inzwischen auch angefangen sowas zu basteln - ist allerdings etwas diletantischer als deine Variante ;) Ich hab alle Worte in ner Tabelle und die "Matches" in ner weiteren. Wird ein Wort gesucht > SELECT * FROM wortetabelle > wenn leer kein eintrag; wenn Wort vorhanden> SELECT * FROM matsches WHERE wordid=id_vorige_abfrage .

Funktioniert jedenfalls. Hab übrigens auch mal in meinem Forum geschaut (phpBB), da gehts genauso und dass die "matches Tabelle" mehr als 40.000 Einträge hat scheint nicht zu stören.

Danke für deine Antwort - Manfred

 
kressevadder
14-08-2003, 11:21 
 
Hallo,

select distinct WORT, max(FK), count(*) from suchbegriff

falls Du mal muse hast könntest Du mir das mit dem FK vielleicht mal erläutern, aus der Bedienungsanleitung bin ich nicht schlau geworden, bzw hab nix gefunden (fk ist als Suchbegriff zu kurz), oder vielleicht ein Link zum Dummy Torturial.

Ausser abbunkern und auslesen krig ich bisher nicht viel mehr mit mysql hin. Mein Script hat daher auch entsprechend viele DB-Abfragen.

Gruss

 
Titus
15-08-2003, 11:33 
 
FK ist erstmal nur ein Spaltenname, nebenbei auch noch ein geläufiges Kürzel for "Foreign Key".
Damit ist eine Spalte gemeint, die auf den Primary Key einer anderen Tabelle verweist - in deinem Fall auf die Tabelle mit den Texten.

Die Query im Detail:
select distinct WORT, max(FK), count(*) from suchbegriff group by WORT
(den letzten Teil hatte ich oben vergessen)

Zu jedem in der Tabelle gespeicherten WORT erhältst den Maximal-Wert von FK und die Anzahl der Vorkommen ...
Ist das Wort bisher nicht vorhanden, so ist max(FK)=0 und count(*)=1
und das wird in den folgenden if-Abfragen ausgenutzt.

Tipp: Lies mal den Abschnitt 7.3.6 Funktionen zur Benutzung bei GROUP BY-Klauseln (http://www.mysql.de/doc/de/Group_by_functions.html) im MySQL-Handbuch.

 
kressevadder
15-08-2003, 13:11 
 
Dank' dir :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:24 Uhr.