> I agree. That is a wise statement, and I have tried to do this with
> regular
> expressions but this doesn't deal with relevance at all, or is there
> something that I am missing? I suppose I could do multiple searches on my
> data to look for "sports cars" first, "cars" second, and "sports" last.
> Then
> I could deal with the separate issue of the text files.
Your database may provide a "full text" search system you can use, which
would be Good in terms of performance, but probably Bad in terms of
portability.
If you need portability, something like this:
<?php
$words = split('/\\s/', $_POST['search']);
//Ignore multiple inputs of same word:
$words = array_flip(array_flip($words));
$query = " select fields, you, need, ";
//This is for real:
$query .= " (description like '%$search%') ";
reset($words);
while (list(, $word) = each($words)){
$query .= " + (description like '%$word%') ";
}
$query .= " as score, ";
//This is just for debugging, so you can see where points are garnered:
$query .= " (description like '%$search%') as perfect, ";
reset($words);
while (list(, $word) = each($words)){
$query .= " (description like '%$word%') as 'word_$word', ";
}
$query .= " 'filler' "; // Just for the extra comma at the end of the loop
$query .= " from whatever ";
$query .= " order by score desc ";
$matches = mysql_query($query) or trigger_error(mysql_error() . "
$query", E_USER_ERROR);
while ($row = mysql_fetch_array($matches)){
list($fields, $you, $want, $score) = $row;
//For debugging only:
echo "Scoring<br />\n";
echo "Perfect: $row[perfect]<br />\n";
reset($row);
for ($i = 0; $i < 4; $i++) each($row); //Ignore stuff we already printed
for ($i = 4; $i < count($row); $i++){
list($word, $points) = each($row);
echo "Word match ($word): $points<br />\n";
}
}
?>
You'll need to convince MySQL to convert boolean to 0/1.
You can also apply scaling factors so that a perfect match gets, say, 10
points, intead of just 1:
$query .= " 10 * (description like '%$search%') as perfect ";
This is crude, but effective, and can easily be ported to any SQL engine
-- Except, of course, for the data-type conversion from a boolean result
to int, which you need to tweak, but that should be fairly easy to work
out a hack for all SQL engines, perhaps by using a variable function name:
$query .= " 10 * $sql_bool_to_int(description like '%$search%') as perfect ";
You then define $sql_bool_to_int for each SQL engine you need, and Bob's
your uncle.
--
Like Music?
http://l-i-e.com/artists.htm
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php