SELECT p. * , m.category_id AS cid, m.category_name ,
MATCH(p.`what`, p.`description`, p.`short_description`) AGAINST ('james Bond Good Man' IN BOOLEAN MODE)
OR MATCH(m.category_name) AGAINST ('james Bond Good Man' IN BOOLEAN MODE) as score
FROM tbl_post AS p
LEFT JOIN map_category_post AS m ON p.post_id = m.post_id
WHERE ( MATCH(p.`what`, p.`description`, p.`short_description`)
AGAINST ('james Bond Good Man' IN BOOLEAN MODE)
OR MATCH(m.category_name) AGAINST ('james Bond Good Man' IN BOOLEAN MODE) )
AND p.adult_content =0
GROUP BY p.post_id
order by score desc
* don't do OR in the SELECT part and expect "score" to be useful.
* Do you know that AGAINST ('+james +Bond +Good +Man' IN BOOLEAN MODE) will require all 4 words; what you have does not.
* For "exact match", will this work?
(what = 'james Bond Good Man' OR description = 'james Bond Good Man' OR short_description = 'james Bond Good Man')
* If not, what do you mean by exact match?
* Consider UNION:
(
SELECT ..., 999 as score ... WHERE what = 'james Bond Good Man'...
) UNION (
SELECT ..., MATCH... as score ... WHERE MATCH ...
) ORDER BY score desc;