Ik wil graag een zoekfunctie makenop mijn site. Hiervoor heb ik gekeken naar de manier hoe phpbb dit doet. Die zet elk woord dat langer is dan 3 leters in een db, en koppelt dat woord weer aan een topic. Ik vroeg me alleen af bij deze techniek (elk woord in de db gooien), geeft dit niet een hoge belasting van de mysql server?
nee, omdat het bij een database (tot op zekere hoogte) niet uit maakt hoeveel data er in staat. Het gaat er om hoe jij de data er uit haalt.

De oplossing van PhpBB is precies hetzelfde als MySQL FullText. Beide oplossingen indexeren alle woorden.
Valt wel mee. Ligt er natuurlijk wel aan hoe vaak die zoekfunctie gebruikt wordt en hoeveel topics er op die site gaan komen. Als welk veld-type wou je zoekwoorden gaan opslaan? text, varchar?
maar als je een bericht hebt met 100 nieuwe woorden, moeten die allemaal via 100 query's (of kan het beter?) in de db worden gezet. krijg je dan niet veel verkeer? want ik denk niet dat mijn host het op prijs steld dat ik hun db server overbelast.

@Jaws, ik denk als varchar van 100 tekens ofzo (neemt minder gereserveerde ruimte in beslag), of is text beter?
als je van te voren weet hoeveel tekens je wilt gebruiken voor die woorden kun het beste varchar gebruiken. Text heeft een mindere performance dan char of varchar.

Je hebt ook geen 100 queries nodig. Een query is genoeg lijkt me. Je laat gewoon PHP het werkt doen van het sorteren van woorden >3 letters. Dan plaats je alle gevonden woorden met 1 query bij het betreffende topic.

Je kunt ook meerdere records invoegen met 1 query.

INSERT INTO tabel (kolom1, kolom2)
VALUES
    (waarde1, waarde2),
    (waarde3, waarde4),
    (waarde5, waarde6)

Of nog beter maak je gebruik van een prepared statement met behulp van de mysqli extensie (of eventueel PDO).

Als je alle woorden in een aparte tabel gaat opslaan, zorg dan wel dat je ten eerste een koppeltabel gebruikt om de topics aan een woord te koppelen. Bepaalde woorden zullen namelijk veel vaker voorkomen en die ga je natuurlijk niet dubbel opslaan.

En zorg er daarnaast voor dat je een index aanbrengt op de kolom met woorden. Anders moet MySQL elke keer als je een woord zoekt, de hele tabel met woorden gaan doorzoeken.
Oke, dat is wel handig, alles in 1x ja. Maar voor de controle of ze er al instaan, kan ik dan beter op het woord zoeken in de db, of alle woorden eruit halen, en dan controleren of het bestaat? En als het beter woord voor woord in de db kan zoeken, kan je dan ook een select statement maken dat zeg maar een soort loop is, net als die insert die Blanche laat zien?
@achtbaanfreak

Je kan in MySQL aangeven dat de kolom "zoekwoord" in de tabel voor de zoekwoorden uniek moet zijn. Hiermee voorkom je dat er dubbele woorden in de tabel komen te staan.
niet meer van toepassing, lees volgende bericht
Ik kan zo'n uniek veld maken ja, maar ik moet alsnog de index van het woord aan het bericht waar het inzit koppelen. Dus kan je niet beter eerst alles uit de tabel halen waar het zoekwoord gelijk is aan zo'n woord uit een bericht. Daarna het bericht aan de bestaande zoekwoorden koppelen en vervolgens de nieuwe zoekwoorden erin gooien waarna je deze gaat koppelen aan een bericht?
Niet Bumpen.
Bumpen:
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.

Reageren