Yes, Twitter's search API tends to produce different results than what you might find when searching on Twitter.com. For example, if I search for "habuma" on Twitter.com, I get 2 results under Top, 1 under All, and 1 under With Links. Meanwhile, the same search through Twitter's search API (http://search.twitter.com/search.json?q=habuma) gives me only 1 result...and only 1 result if I filter with links (http://search.twitter.com/search?q=habuma&filter=links). I haven't figured out how to get the search API to show me the same 2 results I get when serching on Twitter's site under Top.
Per the search API's documentation (http://developer.twitter.com/pages/using_search), the search API has some limitations, including that it can't find tweets more than about a week old and that it is focused on relevance and not completeness (some tweets may not show up).
As for the differences you asked about...
"rainbow" finds all tweets with that word in them (or in the user's name, it seems).
"#rainbow" finds all tweets with that hashtag
"@rainbow" finds all tweets that reference the user whose screen name is rainbow
There are other search operators listed in the search API documentation.
Spring Social Project Lead