Hey there!
The difference is that columns of type 'fulltext' (or 'phrase' or 'fulltext_with_shingles') are analyzed by Elasticsearch, whereas all other types (including 'text', 'varchar(n)') are indexed as whole values.
Assume you have a row in Postgres where the value for "long_description" is: "this string is a test of using ZombodB".
In the case where "long_description" is of type fulltext, you could simply search: ==> 'long_description:test' and find that row. And this would be extremely fast.
In the case where "long_description" is of type text, you'd have to do the left/right wildcard truncation: ==> 'long_description:*test*'. And this would be extremely slow because Elasticsearch would have to scan the entire terms index to do the full sub-string search. In general, left truncation is a *TERRIBLE* thing to ask Elasticsearch to do.
In general, the column types you chose should, if they're string values, should best represent how you want to be able to search it via Elasticsearch -- either "full, exact value" or individual terms (text v/s fulltext/phrase).
I hope this helps. If not, please let me know.
eric