Aufbau der Suchfunktion eines Forums

Arne Buchwald

Erfahrenes Mitglied
Hallo,

mich interessiert, wie z.B. hier im vBB die Suche vonstattengeht. Es gäbe natürlich die Möglichkeit jeden Beitrag mit LIKE zu durchsuchen, aber das kann's ja auch nicht wirklich sein ...
 
Ich nehme jetzt einfach nur mal ein Forum mit 10.000 Beiträgen an, wobei 10.000 nun weiß Gott nicht viel ist. Da muss es doch eine bessere Methode geben, als alle 10.000 Beiträge nach dem/den Suchbegriff/en zu durchforsten.
 
jup...bei phpbb wird es so gehandhabt, das einmal eine tabelle "search_wordlist" existiert in welcher ALLE wörter, die in den beiträgen und beitragtiteln geschrieben wurden, auftauchen und mit einer id versehen sind. jedes wort ist selbstverständlich nur einmal drin.
Code:
CREATE TABLE search_wordlist (
  word_text varchar(50) binary NOT NULL default '',
  word_id mediumint(8) unsigned NOT NULL auto_increment,
  word_common tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (word_text),
  KEY word_id (word_id)
) TYPE=MyISAM;
wozu hier das word_common steht, weiß ich nicht- kann man sicherlich weglassen.

in einer zweite tabelle "search_wordmatch" stehen dann zu jeder id eines topics die id's vorkommender wörter drin und in einer dritten spalte wird festgelegt, ob das jeweilige wort im titel (1) oder im text des beitrages (0) vorkommt.
Code:
CREATE TABLE search_wordmatch (
  post_id mediumint(8) unsigned NOT NULL default '0',
  word_id mediumint(8) unsigned NOT NULL default '0',
  title_match tinyint(1) NOT NULL default '0',
  KEY post_id (post_id),
  KEY word_id (word_id)
) TYPE=MyISAM;

beim suchen wird nun lediglich die id des suchworts aus search_wordlist ausgelesen und über diese id werden in der tabelle search_wordmatch die matches bestimmt.

dieses system ist sehr effektiv aber raubt auch sehr viel db-speicher ;-).

cu bloddy
 
Zuletzt bearbeitet:
Hey - vielen Dank. :) Das hört sich doch schon wesentlich besser an. Die Platz ist kein Problem - die Geschwindigkeit ist das a und o.

Code:
CREATE TABLE search_wordmatch (
...
word_id mediumint(8) unsigned NOT NULL default '0',
...
Da frage ich mich gerade, wie das mit einem 8stelligen Feld zu schaffen sein soll? Werden die ganzen IDs der Search_Wordlist noch "gepackt" oder wie entsteht ein durchgehender Wert ?

Werden die Tabellen search_wordmatch und search_wordlist bei jedem Post ergänzt oder muss dieser Vorgang immer erst aus der Administration gestartet werden ?
 
die word_id ist eine fortlaufende id (auto_increment) und somit eine eindeutige zuordnung zu jedem word_text.

diese eindeutige zuordnung wird in der match tabelle als fremdschlüssel benutzt.

ja bei jedem posting werden diese beiden tabellen aktualisiert (anders gehts auch nicht).

noch fragen? :D
 
hmmm gibt es in der version auch eine tabelle mit Ausschluss Wörtern ?

Nach dem Motto (und oder usw) sind Wörter
nach den sicher nicht gesucht wird
 

Neue Beiträge

Zurück