The usual reason why people don't get the results they expect is because they have not read the section on full text search restrictions . In particular, they have not taken in the fact that words that appear in 50% or more rows are ignored. Now my guess is that your 'knife' is in most rows and is ignored, and the results you are getting are for matches against other words in your $keywords.
By the way your query construction syntax is all to pot.
mysql_connect(localhost,$dbusername,$dbpassword);
@mysql_select_db($database) or die( "Unable to select database");
$query = "SELECT * FROM items WHERE MATCH(description) AGAINST ('$keywords')";
$result = mysql_query($query);
$TotalRows = mysql_numrows($result);
mysql_close();
// OR
mysql_connect(localhost,$dbusername,$dbpassword);
@mysql_select_db($database) or die( "Unable to select database");
$query = "SELECT * FROM items WHERE MATCH(description) AGAINST ('" . $keywords . "')";
$result = mysql_query($query);
$TotalRows = mysql_numrows($result);
mysql_close();
Also, you don't need to use mysqp_close(). PHP uses reference-counting and
"it is automatically detected when a resource is no longer referred to (just like Java). When this is the case, all resources that were in use for this resource are made free by the garbage collector. For this reason, it is rarely ever necessary to free the memory manually by using some free_result function." - like mysql_close()
It would help if, when posting this code you had also posted the $keyword string so that we could see what the final wuery string would be.