Building a Simple Search Engine with PHP
Subject:   RE: multiple keywords
Date:   2003-12-22 01:57:16
From:   dsolin
Response to: multiple keywords

Hi Sean,

As pointed out by a previous poster, the easiest way to implement multiple keyword searching would probably be to use MySQL's Full-text Search. Detailed information about this feature can be found at:

You will need to rewrite the example program used in the article for it to use Full-text Search, but that should be quite simple to do.

Good luck!


Full Threads Oldest First

Showing messages 1 through 5 of 5.

  • RE: multiple keywords
    2003-12-22 17:59:54  anonymous2 [View]

    Thank you Daniel.

    I have been looking at your link above, but have no luck in seeing this through. First of all, I still do not understand the FULLTEXT context. And how I would alter the table to incorporate such feature, then bringing it to the Search.php section.

    I hope you can help me here.

    Best regards,
    • RE: multiple keywords
      2004-09-21 10:57:36  cityslicker [View]

      Hi All,

      Thanks for the code - it is great.

      Just inform you of my edits and how I used multiple keywords.

      1st of all - I put the keyword extraction script in a function.

      I would use it to list titles and keywords of pages as well as main body text. I call the function 3 times for words in a title, twice for keywords and once for main body text. This is a way of scoring a page.

      E.g. when a search is done on 'business' and a page title has the word 'business' in it will show 3 occurrences (although I dont show occurrences I just use the score to order the list)

      2. Multiple keywords.

      Basically, I use the explode() function to get an array or keywords and loop through them applying them to the query. I keep the scores for each word and add them together before displaying the list by highest score.


      /* Get timestamp before executing the query: */
      $start_time = getmicrotime();

      $keyword_array = explode(" ", $_GET['keyword']);

      $score = array();
      foreach($keyword_array as $keyword)

      /* Set $keyword and $results, and use addslashes() to
      * minimize the risk of executing unwanted SQL commands: */

      /* Execute the query that performs the actual search in the DB: */
      $result = mysql_query(" SELECT p.page_title AS title,
      COUNT(*) AS occurrences
      FROM pages p, word w, occurrence o
      WHERE p.pageID = o.page_id AND
      w.word_id = o.word_id AND
      w.word_word = \"$keyword\"
      GROUP BY p.pageID
      ORDER BY occurrences DESC
      LIMIT 0, 5" );

      for( $i = 1; $row = mysql_fetch_array($result); $i++ )

      $score[$row['title']] += $row['occurrences']; //Array of scores


      if(count($score) > 0)
      arsort($score); //Reverse sort the associative array scores by highest

      /* Get timestamp when the query is finished: */
      $end_time = getmicrotime();

      /* Present the search-results: */
      print "<h2>Search results for '".$_GET['keyword']."':</h2>\n";
      //Loop through array and display results

      while ($element = each($score)) //Loop through array and output results

      echo $element[ "key" ];
      echo " - ";
      echo $element[ "value"];
      echo "


      /* Present how long it took the execute the query: */
      print "query executed in ".(substr($end_time-$start_time,0,5))." seconds.";

      //Display a no pages found page


      // END CODE

      This works fine but is a little slower if the user wants to search for a sentence. All in all, it is an easy add-on to the already supplied code that provides multiple keyword searching.

      Hope this helps someone!
      • RE: multiple keywords EDIT
        2004-09-21 11:10:36  cityslicker [View]

        Hi again,

        Just a small edit from the code above.

        If a user seached for "good web sites" and a page contained 100's of 'good' but no 'web' and 'sites' then it would rank higher than a page which can have all three. This is not what we want so ammend the above code with this part:

        for( $i = 1; $row = mysql_fetch_array($result); $i++ )

        $score[$row['title']] += $row['occurrences']; //Array of scores
        if($row['occurences'] > 0) { $score[$row['title']] += 1000; } //This makes pages containing all keywords rank highest

        You can set the 1000 to whatever you like but you should be safe with that number.

        • RE: multiple keywords EDIT
          2004-09-21 11:19:15  cityslicker [View]

          Hi once more!!

          Make sure you spell occurrences correctly unlike in my code above!!

          • RE: multiple keywords EDIT
            2009-11-04 09:45:30  xoqqa [View]

            Would you be so kind to send me your version of this search engine please? I've been trying to figure out what is wrong with mine and noticed that yours is somewhat different. For example I don't have page_title but just urls... I think you've also modified the populate script.

            I would appreciate if you can send me the script files on sammutmatu[at]