[PHP/MySQL]Zoekmachine: wat is wijsheid?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Gegroet,

Achter mijn site (een maandelijks Metal E-zine - zie undersign) heb ik een redelijk forse database liggen. Elke maand komt er een nieuwe issue uit en middels een variabele hou ik bij in welke issue een artikel komt te staan. Is deze variabele kleiner dan die van de huidige issue, dan komt alles automatisch in het archief te staan..

Tot zover nog geen problemen maar aangezien onze archiefpagina nog niet werkt (is momenteel statisch en al maanden niet meer bijgewerkt) vonden mijn hoofdredacteur en ik dat het weleens tijd werd om hier wat meer systeem in aan te brengen. Losse overzichten van alle artikelen per issue en dergelijke dat gaat me wel lukken denk ik maar het leek ons ook wel een goed idee om de lezer zelf te kunnen laten zoeken naar bijvoorbeeld artikelen over zijn/haar favoriete band.

Ik heb al even een simpele tekstbalk voor de zoekterm met knop ernaast in elkaar gezet maar nu wil ik verder gaan en ik begon me toch het een en ander af te vragen:

1) Zou ik een aparte tabel in mijn database moeten opnemen met de opgegeven zoekstring welke vervolgens vergeleken wordt met alle entries in de database?

2) Kan dit ook met een tijdelijke variabele opgelost worden ook al werk ik niet met sessies?

3) in geval ik voor optie 1 kies, kan het dan geen kwaad als ik na het uitvoeren van de zoekopdracht de betreffende entry (welke ik de parameters "auto_id" en "zoekstring" wil meegeven) uit de database verwijder?

Het coderen ervan gaat me allemaal wel lukken denk ik maar ik wilde graag van jullie weten hoe jullie dit aan zouden pakken. Bij voorbaat dank..

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

Verwijderd

Ik neem aan dat je MySQL gebruikt? Mischien moet je eens kijken naar de Full-Text Search van MySQL.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Er zijn inderdaad heel wat mogelijkheden.
  1. LIKE of REGEXP search. Hiermee match je records tegen een bepaalde zoekstring. Voorbeeld:
    code:
    1
    2
    3
    4
    5
    6
    7
    
    SELECT
       meuk
    FROM
       table
    WHERE
       table.title LIKE '%searchword1%'
       OR table.title LIKE '%searchword2%';
  2. FULLTEXT indices gebruiken. Zie voor meer informatie de MySQL documentatie
  3. Zelf de database indexeren. Maak een tabel die aangeeft hoe vaak een woord in een tekst of record voorkomt, en query op die tabel om erachter te komen welke records de woorden bevatten. Hoe vaker ze voorkomen, hoe relevanter de tekst. Eventueel kun je een titel meer "waarde" geven dan tekst, en voetnoten weer minder.
1 is een redelijk slordige oplossing, gezien het relatief lastig is om relevantie van een gevonden record aan te tonen.
2 is een eenvoudige oplossing maar biedt redelijk weinig flexibiliteit
3 is de meest flexibele oplossing, maar tegelijkertijd het lastigst te implementeren (kost wat tijd om uit te denken en te implementeren ;))

take your pick :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
drm schreef op 25 November 2002 @ 18:36:
Er zijn inderdaad heel wat mogelijkheden.

1 is een redelijk slordige oplossing, gezien het relatief lastig is om relevantie van een gevonden record aan te tonen.
Dat valt denk ik nog wel mee.. Je maakt er hier 1 SQL statement van terwijl ik zelf in zo'n geval er een stuk of 5 van wil maken (onderscheid maken per rubriek en steeds maar met 1 veld uit de betreffende tabel laten vergelijken om even te beginnen.. ;))
2 is een eenvoudige oplossing maar biedt redelijk weinig flexibiliteit
Plus daarbvij dat het volgens mij best een forse belasting is op mijn databeestje..
3 is de meest flexibele oplossing, maar tegelijkertijd het lastigst te implementeren (kost wat tijd om uit te denken en te implementeren ;))
Daarom ook.. Ik denk dat ik dan door de bomen het bos niet meer zie op een gegeven moment...


De eerste optie lijkt me dus even de beste vooralsnog maar dan blijft de vraag: Moet ik hiervoor een extra tabel in de database aanmaken of kan ik het ook afdoen met een tijdelijke variabele?

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

Verwijderd

FullText vertraagt vooral het inserten van data, er moeten immers indices worden aangemaakt, het selecten gaat vrij snel. Ik denk zelfs sneller dan met regexp's of like's. Je kan ze natuurlijk ook combineren...

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

judgem:
Dat valt denk ik nog wel mee.. Je maakt er hier 1 SQL statement van terwijl ik zelf in zo'n geval er een stuk of 5 van wil maken (onderscheid maken per rubriek en steeds maar met 1 veld uit de betreffende tabel laten vergelijken om even te beginnen.. ;))
Ach, als je een beetje slim je queries laat genereren door een functie, dan is dat opeens helemaal zo lastig niet meer.
Plus daarbvij dat het volgens mij best een forse belasting is op mijn databeestje..
Ik denk dat dat heel erg meevalt. 't Is bij selecten iig sneller dan bij optie 1.
Daarom ook.. Ik denk dat ik dan door de bomen het bos niet meer zie op een gegeven moment...
Nah, 't is eigenlijk niets anders dan een klein datamodelletje op zetten. 't Vergt wat voorbereiding maar voor iemand met een gezond verstand een google bij de hand komt een heel eind, hoor
De eerste optie lijkt me dus even de beste vooralsnog maar dan blijft de vraag: Moet ik hiervoor een extra tabel in de database aanmaken of kan ik het ook afdoen met een tijdelijke variabele?
Hoe bedoel je?
_J_R_R:
FullText vertraagt vooral het inserten van data, er moeten immers indices worden aangemaakt, het selecten gaat vrij snel. Ik denk zelfs sneller dan met regexp's of like's. Je kan ze natuurlijk ook combineren...
Fulltext is bij selecten absoluut sneller dan bij like of regexp search. 't Is niet voor niets een index ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

FullText heeft ook zo zijn nadelen (ik heb ze al eens eerder genoemd):
1) Je weet niet of er nou echt 0 resultaten zijn of er juist te veel resultaten zijn (> %50) je krijgt gewoon een lege recordset terug. Erg lastig om dit je gebruikers duidelijk te maken
2) De 'relevance' die je terugkrijgt heeft een grens van 0 tot een onbekende bovengrens. Zonder bekende bovengrens is het lastig om te rekenen...

Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Dank u allen voor het meedenken tot op heden :)

Ik ga denk ik even in de weer met een zoekstring die wordt opgeslagen in de database welke vervolgens wordt uitgelezen en vergeleken (middels LIKE) met een aantal velden in de overige tabellen.. Nadat de zoekfunctie voltooid is, zal de zoekstring uit de database verwijderd worden....

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

dus, iemand vult een zoekwoord in, jij zet die in de database, vervolgens lees je diezelfde string weer uit de database, je maakt er enkele queries mee, en dan verwijder je hem uit de database.

Ik begrijp niet helemaal waarom je de string in de database zet ? :?

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Ik vind het wat aan de linke kant om er een tijdelijke variabele voor aan te maken aangezien ik niet met sessies werk. Stel je nu voor dat er gelijktijdig meerdere bezoekers een zoekopdracht geven, volgens mij kom je dan in de knoei of denk ik nu verkeerd?

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Dus je wilt maar maximaal 1 zoekopdracht tegelijk mogelijk maken?
Stel je voor, dat ik wil zoeken, maar dan staat er: 'Even geduld aub er zijn nog 4 zoekenden voor u' ;)

Het is makkelijk mogelijk om meerdere queries tegelijk te laten lopen hoor. En anders kan je dat natuurlijk van te voren goed testen, hoe lang een query precies duurt.

[edit] ik denk dat je het niet helemaal snapt. Iedereen die je zoekpagina opent, krijgt een eigen 'instantie' van de pagina voor zich. Ook wanneer ze een zoek-opdracht doen, wordt deze apart behandeld door de webserver. De variabelen die je op dat moment in je script hebt, zijn alleen voor die ene gebruiker.
Het is dus heel goed mogelijk dat er meerdere (tientallen, duizenden) mensen tegelijk een zoekopdracht doen, zonder dat ze last van elkaar hebben!

[ Voor 42% gewijzigd door thomaske op 25-11-2002 23:05 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Ow op zo'n fiets! :+

Daar was ik me inderdaad niet van bewust.. Dank u voor de heldere toelichting :)

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Ik heb het even wat druk gehad met het een en ander (je bent tenslotte maar 1 keer per jaar jarig he ;)) dus veel heb ik niet kunnen doen. Maar goed, ik ben weer wat verder gegaan en ik heb het een en ander in elkaar geknutseld.

Noot vooraf: Mijn bedoeling is om de bezoeker in de tekstbalk een zoekstring op te laten geven welke vervolgens ingelezen wordt en gekopieerd wordt naar de URL van de resultatenpagina waarin ik hem kan uitlezen en er een aantal queries op los kan laten.. Het huidige bestand (genaamd "search.php") wil ik op meerdere plaatsen in de site kunnen includen... ow ja.. Mijn site is 2-talig dus vandaar de variabele $lang erin...

De code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$query = 'blaat';                 //vooraf alvast een testwaarde opgegeven

if ($lang == 'nl')
{
    $buttontxt = 'Zoeken kreng!';
    $zoektekst = 'Voer hier uw zoekopdracht in';
}
else
{
    $buttontxt = 'Search it!';
    $zoektekst = 'Enter your terms of search here';
}


if ($action == 'save')
{
    $query = getfield('query');
    $lang = getfield('lang');
}

/* Hier de HTML-code voor de search:     */
?>

<form method=POST action="searchresult.php?query=<?= $_GET["query"] ?>&lang=<?= $lang ?>" name="searchform">

<center>
<input name="query" type="TEXT" size="25" maxlength="50" value="<?= $zoektekst ?>" onClick="value=''">
<br><input type="submit" value="<?= $buttontxt ?>" border=0>
<br></center>

<br>

<INPUT TYPE=hidden name="query" value="<?= getfield ('query'); ?>">
<INPUT TYPE=hidden name="lang" value="<?= $lang ?>">
<INPUT TYPE=hidden name="action" value="save">

</form>


Hij staat ook online op:
- http://lordsofmetal.zwaremetalen.com/search.php?lang=nl (Nederlands)
- http://lordsofmetal.zwaremetalen.com/search.php?lang=en (Engels)

Ik hoop dat iemand ziet wat ik verkeerd doe..


Bij voorbaat alvast enorm bedankt...

[ Voor 15% gewijzigd door judgem op 27-11-2002 23:48 . Reden: dit was zelfs te breed voor mijn 19" :+ ]

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Ik hoop dat iemand ziet wat ik verkeerd doe
je haalt een hoop door elkaar..

Je hebt op de pagina searchresult.php het daadwerkelijke zoekscript neem ik aan?

searchresult.php
PHP:
1
2
3
4
5
6
7
<?
$search_query = addslashes($_REQUEST["query"]);

$sql = "SELECT * FROM dingen WHERE tekst LIKE '%{$search_query}%';"

//--- blabla, etc
?>

nu moet je dus zorgen dat je naar deze pagina de $query gegevens stuurt (OF met GET OF met POST, met post is het makkelijkst:

zoek.php
HTML:
1
2
3
4
<FORM METHOD=POST ACTION="searchresult.php">
<INPUT TYPE="text" NAME="query"><BR>
<INPUT TYPE="submit">
</FORM>


Dit is echte BASIS php en in elk boek/manual/etc te vinden!
maar ik ben in een goede bui vandaag...! :)

[ Voor 10% gewijzigd door thomaske op 28-11-2002 13:15 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Dank u voor het hardop meedenken maar geloof het of niet, nog steeds geen resultaat.. Ik probeer in mijn searchresult.php middels echo de waarde uit te lezen maar ik krijg een syntax error.. Volgens mij komt hij er toch niet doorheen... :(

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Watvoor syntax error? deze meldingen zijn meestal vrij duidelijk!

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Welnu, ik heb even de oorspronkelijke code wat gestript en het bestand tot "search2.php" omgedoopt. De code van het formulier is nu als volgt:

PHP:
1
2
3
4
5
6
7
<form method=POST action="searchresult.php">
<center>
<input type="TEXT" name="query" size="25" maxlength="50" value="<?= ubb($zoektekst) ?>" onClick="value=''">
<br>
<input type="submit" value="<?= $buttontxt ?>" border=0>
<br></center>
</form>


Dat geeft dit op het scherm:

Afbeeldingslocatie: http://we-the-gods.zwaremetalen.com/zooi/pics/search1.jpg

Als ik dan op "Zoeken kreng!" klik, roept hij dus het bestand "searchresult.php" aan wat enkel bestaat uit deze code:

PHP:
1
2
3
4
5
6
<? php

$search_query = addslashes($_REQUEST["query"]);

echo $search_query;
?>


zoals je ziet is het enige wat ik wil doen de zoekstring laten tonen op het scherm alleen krijg ik nu deze foutmelding:
Parse error: parse error in /home/lom/html/searchresult.php on line 3
Ik snap het allemaal niet meer... :( :'(

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

op regel 1 begin je met <? php, of haal de spatie voor php weg, of haal gewoon heel php weg! :)

verder begrijp ik niet ondertussen wel waarom je in je search2.php dit hebt:
code:
1
.. value="<?= ubb($zoektekst) ?>" onClick="value=''">

[ Voor 18% gewijzigd door thomaske op 29-11-2002 16:14 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
thomaske schreef op 29 November 2002 @ 16:13:
op regel 1 begin je met <? php, of haal de spatie voor php weg, of haal gewoon heel php weg! :)
Bij deze gedaan maar het helpt helaas niks..
verder begrijp ik niet ondertussen wel waarom je in je search2.php dit hebt:
code:
1
.. value="<?= ubb($zoektekst) ?>" onClick="value=''">
2-taligheid mijn beste.... :)

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

wijzig searchresult.php eens naar:
PHP:
1
print_r($_REQUEST);

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Het probleem lijkt te zijn opgelost nu :)

Dank u allen voor de hulp. Ik ga eens lekker verder sleutelen en tegen de tijd dat alles operationeel is (waarschijnlijk met ingang van de volgende issue zo rondde 15de december) zal ik dat nog wel laten weten...

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO

Pagina: 1