First off, I can't stand misspellng recipe for a whole answer. Sorry:
Your query might be returning a cartesian product BUT I think you are returning some recipe rows AND some ingredient rows with your double table OR query, and resolving ALL those returned rows which gives the impression of a cartesian product but isn't, exactly.
WHERE (recipe.description like 'cake' OR ingredient.name LIKE 'vanilla')
Will return both cake rows from recipe table
and vanilla rows from ingredient table
If you have 2 cake recipes with vanilla
And 2 vanilla ingredients
You'll have 4 rows that you are linking up.
What you MEAN to say, I think is:
SELECT recipe., ingredient.
FROM recipe, ingredient, recipe_ingredient
WHERE recipe_ingredient.recipe_id=recipe.id
AND recipe_ingredient.ingredient_id=ingredient.id
AND ingredient.name LIKE 'vanilla'
AND recipe.description LIKE 'cake'
Should do the trick.
Your uniqueid column, for recipe_ingredient is redundant, but not wrong.