You can match both title and body in one query if that's what you're after
SELECT title, body, MATCH(title) AGAINST('...') as tmatch, MATCH(body) AGAINST('...') as bmatch
FROM tbl
HAVING tmatch OR bmatch
ORDER BY tmatch DESC, bmatch DESC
Since no match gets the value 0, you include anything where either tmatch or bmatch is not 0. Then you order first by title match relevancy and then by body. I.e. no matter how good the body match is if the title doesn't match, it will still come after a lousy title match where the body doesn't match at all.
To cache the results, you can't use a temporary table, since it only exists for the connection creating it, and as soon as the connection goes, so does the table. You could however create a view or table containing the above together with user_id, index on user_id. When a user performs a new search, you remove existing rows for that user_id.