[PHP/MySQL] Search met FULL TEXT

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben druk bezig met mijn eerste zoek script en heb via Zend.com een goede tuto gevonden en deze toegepast op mijn database tabellen.

Mijn bronnen:
http://www.zend.com/zend/tut/tutorial-ferrara1.php
[rml][ php/mysql] Zeer goede search[/rml] (hier helaas ook weinig aan gehad)

Hoe en wat
Ik heb een eigen gemaakte CMS systeem en alle pagina's worden in de database opgeslagen. Nu wil ik met een search kunnen zoeken naar woorden in die database.

Het probleem
Nu heb ik 3 pagina's in de database staan. Nu heb ik 1 daarvan die heet `Disclaimer` en toen daarop gezocht en deed die het.
Nu heb ik een tweede pagina met tekst toegevoegd met daarin ook het woord 'Disclaimer'. Nu loopt ie hier op vast en zegt ie: niks gevonden.
Dus mijn vermoede zegt dat er een fout ontstaat in de while, maar heb hier niks op kunnen vinden.

Mijn 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?
global $creation;
// search engine
if($_GET["search"])
    {
    $zoek = $_GET["search"];
    
     print ("U heeft gezocht op <i>$zoek</i>");
     print ("<Hr align=Left class=hrule><BR>");
     //maak tabelstart
     print ("<table align=center cellspacing=0 cellpadding=0 border=0 width=\"100%\">");

    $request = "SELECT *, MATCH(`page_name`,`page_content`) 
                AGAINST ('" . addslashes($_GET['search']) . "') 
                AS score FROM cms_pagina 
                WHERE MATCH(`page_name`,`page_content`) 
                AGAINST('" . addslashes($_GET['search']) . "') 
                ORDER BY score DESC";
    $res = mysql_query($request) or die (mysql_error());

     while ($rij = mysql_fetch_assoc($res))
      {
       $id          = $rij["page_id"];
       $naam        = $rij["page_name"];
       $content     = $creation->page_verkort("$rij[page_content]", "100");
       $content     = $creation->no_ubb("$content");
       $score       = $rij["score"];

       //maak tabelinhoud
       print "<tr><td><a href=\"index.php?mod=pages&id=$id\" class=\"search_link\">$naam</a></td></tr>";
       print "<tr><td>$content</td></tr>";
       print "<tr><td>$score</td></tr>";
      }
     print "</table>";
    
     //error message (niets gevonden)
     if (!$naam) 
      {
      print ("<BR><BR>Geen artikelen gevonden op de zoekopdracht <i>$zoek</i>");
      }
    }
else
    {
    ?>
    <BR><BR>
    <center>
    <form action="index.php?mod=zoek">
    <input type="hidden" name="mod" value="zoek">  
    <input type="text" name="search" size="25"><BR><BR>
    <input type="submit" value="Begin met zoeken!!"> 
    </form>
    </center>
    <?
    }
?>


Er zullen kwa opmaak en dergelijke veel dingen niet kloppen, maar das nu niet echt mijn zorg. T'is een beetje bij elkaar geschraapt om gewoon te kijken hoe het werkt. Alvast bedankt!

Hotmetal

[ Voor 16% gewijzigd door Verwijderd op 22-07-2004 23:57 . Reden: php tag gebruikt ]


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
The search result is empty because the word ``MySQL'' is present in at least 50% of the rows. As such, it is effectively treated as a stopword. For large datasets, this is the most desirable behavior--a natural language query should not return every second row from a 1GB table. For small datasets, it may be less desirable.

A word that matches half of rows in a table is less likely to locate relevant documents. In fact, it will most likely find plenty of irrelevant documents. We all know this happens far too often when we are trying to find something on the Internet with a search engine. It is with this reasoning that rows containing the word are assigned a low semantic value for the particular dataset in which they occur. A given word may exceed the 50% threshold in one dataset but not another.

The 50% threshold has a significant implication when you first try full-text searching to see how it works: If you create a table and insert only one or two rows of text into it, every word in the text occurs in at least 50% of the rows. As a result, no search returns any results. Be sure to insert at least three rows, and preferably many more
Van de MySQL site! Je script is prima in orde, maar aangezien het zoekwoord in meer dan de helft van de rijen voorkomt heb je geen resultaat.
Een ander iets om op te letten is de minimale woordlengte, de default is vier characters! Woorden van minder characters worden niet gevonden!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
beetle71 schreef op 22 juli 2004 @ 23:57:
[...]


Van de MySQL site! Je script is prima in orde, maar aangezien het zoekwoord in meer dan de helft van de rijen voorkomt heb je geen resultaat.
Een ander iets om op te letten is de minimale woordlengte, de default is vier characters! Woorden van minder characters worden niet gevonden!
Bedankt voor je reactie, ik ken deze quote van de MySQL site niet, maar ik begrijp het probleem. Maar stel dat ik wel die woorden wil vinden, moet ik dan afstappen van het Full-text model?

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Verwijderd schreef op 23 juli 2004 @ 00:00:
[...]


Bedankt voor je reactie, ik ken deze quote van de MySQL site niet, maar ik begrijp het probleem. Maar stel dat ik wel die woorden wil vinden, moet ik dan afstappen van het Full-text model?
Als je woorden wilt zoeken die op meer dan de helft van de pagina's (lees records) voorkomen loop je tegen de '50% treshold' aan.

Je zult je even moeten afvragen of, als straks alles echt klaar is, dit nog wel een probleem is, maw: zitten er dan niet zoveel records in dat het vanzelf goed gaat.

Evt. zou je, maar dat is een heel erg 'vieze' oplossing, de databasetabel kunnen aanvullen met een heleboel 'lege' records.... })

Acties:
  • 0 Henk 'm!

  • boiert
  • Registratie: Oktober 2002
  • Laatst online: 25-06-2024
<form action="index.php?mod=zoek">
<input type="hidden" name="mod" value="zoek">
<input type="text" name="search" size="25"><BR><BR>
waarom heb je ?mod=zoek er nog achter gezet?
je heb het ook al als hidden value en volgens mij verneukt het je url een beetje

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
beetle71 schreef op 23 juli 2004 @ 08:56:
[...]


Als je woorden wilt zoeken die op meer dan de helft van de pagina's (lees records) voorkomen loop je tegen de '50% treshold' aan.

Je zult je even moeten afvragen of, als straks alles echt klaar is, dit nog wel een probleem is, maw: zitten er dan niet zoveel records in dat het vanzelf goed gaat.

Evt. zou je, maar dat is een heel erg 'vieze' oplossing, de databasetabel kunnen aanvullen met een heleboel 'lege' records.... })
Nouja, dat lijkt me niet echt de oplossing, nouja ik moet maar even zien en anders maar een search maken in de nieuwsberichten, die zullen sneller groeien dan de pagina's.
boiert schreef op 23 juli 2004 @ 09:07:
[...]

waarom heb je ?mod=zoek er nog achter gezet?
je heb het ook al als hidden value en volgens mij verneukt het je url een beetje
Het is een pagina in een cms systeem, zoals ik het noem een module.
Waarom ik het zo heb gedaan, omdat het anders niet goed werkt met doorsturen van de gegevens.
Ik wil het niet via een POST manier, maar op een google achtige manier dat je het in de URL kan intikken. Deze manier zorgt er voor dat het wel werkt, ook al vind ik het ook een rare manier.
Pagina: 1