Page 1 of 1

Adding Weights to Site Search Engine

Posted: Fri Sep 19, 2008 6:17 am
by disconne
All helps will be appreciated. I am only a succesfull code copier unfortunately & a little bit modifier.
After explainig my requirement, I pasted my site search php codes.
Best Regards

MySql Table
id author title text

My weights
if searchterm(s) found in column AUTHOR : 100
if searchterm(s) found in column TITLE : 91
if searchterm(s) found in column TEXT : 15

I want that code calculates the # of returns for each row columns. then multiply with coefficients above and make the ranking from highest points to lowest.

An example: Assume that search terms are: "php web John"
in my table row 1 -> 1 result for Author -> so total points: 1 * 100 = 100
in my table row 2 -> 1 result for Title -> so total points: 1 * 91 = 91
in my table row 3 -> 6 results for Text -> so total points: 6 * 15 = 90
in my table row 4 -> 1 result for Author & 1 result for Title -> so total points: (1 * 100)+(1 * 91) = 191

so ranking for display should be
row 4
row 1
row 2
row 3

Code: Select all

 
<?php
 
//Get variables from config.php to connect to mysql server
require 'config.php';
require 'opendb.php';
mysql_query("SET NAMES 'latin5'");
mysql_query("SET CHARACTER SET latin5");
mysql_query("SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
 
//search variable = data in search box or url
if(isset($_GET['search']))
{
$search = $_GET['search'];
}
 
//trim whitespace from variable
$search = trim($search);
$search = preg_replace('/\s+/', ' ', $search);
 
//seperate multiple keywords into array space delimited
$keywords = explode(" ", $search);
 
//Clean empty arrays so they don't get every row as result
$keywords = array_diff($keywords, array(""));
 
//Set the MySQL query
if ($search == NULL or $search == '%'){
} else {
for ($i=0; $i<count($keywords); $i++) {
$query = "SELECT * FROM dis_yazilar " .
"WHERE title LIKE '%".$keywords[$i]."%'".
" OR author LIKE '%".$keywords[$i]."%'" .
" OR text LIKE '%".$keywords[$i]."%'" .
" ORDER BY title";
}
 
//Store the results in a variable or die if query fails
$result = mysql_query($query) or die(mysql_error());
}
if ($search == NULL or $search == '%'){
} else {
//Count the rows retrived
$count = mysql_num_rows($result);
}
 
echo "<html>";
echo "<head>";
 
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-9\">";
 
echo "<title>Your Title Here</title>";
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"../style.css\" />";
echo "</head>";
echo "<body onLoad=\"self.focus();document.searchform.search.focus()\">";
echo "<center>";
echo "<br /><form name=\"searchform\" method=\"GET\" action=\"ara.php\">";
echo "<input type=\"text\" name=\"search\" size=\"20\" TABINDEX=\"1\" />";
echo " <input type=\"submit\" value=\"Search\" />";
echo "</form>";
//If search variable is null do nothing, else print it.
if ($search == NULL) {
} else {
echo "You searched for <b><FONT COLOR=\"blue\">";
foreach($keywords as $value) {
   print "$value ";
}
echo " # of search results </font></b>" . $count;
}
echo "<p> </p><br />";
echo "</center>";
 
//If users doesn't enter anything into search box tell them to.
if ($search == NULL){
echo "<center><b><FONT COLOR=\"red\">Please enter a search parameter to continue.</font></b><br /></center>";
} elseif ($search == '%'){
echo "<center><b><FONT COLOR=\"red\">Please enter a search parameter to continue.</font></b><br /></center>";
//If no results are returned print it
} elseif ($count <= 0){
echo "<center><b><FONT COLOR=\"red\">Your query returned no results from the database.</font></b><br /></center>";
//ELSE print the data in a table
} else {
//Table header
echo "<center><table id=\"search\" bgcolor=\"#AAAAAA\">";
echo "<tr>";
echo "<td><b>title:</b></td>";
echo "<td><b>author:</b></td>";
echo "<tr>";
echo "</table></center>";
 
//Colors for alternation of row color on results table
$color1 = "#d5d5d5";
$color2 = "#e5e5e5";
//While there are rows, print it.
while($row = mysql_fetch_array($result))
{
//Row color alternates for each row
$row_color = ($row_count % 2) ? $color1 : $color2;
//table background color = row_color variable
echo "<center><table bgcolor=".$row_color.">";
echo "<tr>";
echo "<td>".$row['title']."</td>";
echo "<td>".$row['author']."</td>";
echo "</tr>";
echo "</table></center>";
$row_count++;
//end while
}
//end if
}
 
echo "</body>";
echo "</html>";
if ($search == NULL or $search == '%') {
} else {
//clear memory
mysql_free_result($result);
}
?>
 

Re: Adding Weights to Site Search Engine

Posted: Fri Sep 19, 2008 8:00 am
by josh
Hmm are these set in stone requirements? Mysql offers a fulltext search that does more advanced weighting, automatically. Zend framework also has a cool search component called Lucerne that lets you do "google" like field names where the user could search
"+hey -you filenameA:value1 fieldnameB:value2".. that kinda thing, and has lots of configurable options

Re: Adding Weights to Site Search Engine

Posted: Fri Sep 19, 2008 8:18 am
by disconne
thanks for reply Jshpro2. I do not know what is Zend framework. Since I am not a profficient, I am trying to reach to my aim with the code in my hand. (without fulltext structure)
best regards

Re: Adding Weights to Site Search Engine

Posted: Fri Sep 19, 2008 8:21 am
by josh

Re: Adding Weights to Site Search Engine

Posted: Fri Sep 19, 2008 9:45 am
by disconne
jshpro2 wrote:Thank you Jshpro2. Now I am aware of I should totally change my way. I will study the tutorial and hope put here the working weighted full-text search code, best regards

Re: Adding Weights to Site Search Engine

Posted: Fri Sep 19, 2008 11:20 am
by josh
disconne wrote:
jshpro2 wrote:Thank you Jshpro2. Now I am aware of I should totally change my way. I will study the tutorial and hope put here the working weighted full-text search code, best regards
you're welcome