We have a (somewhat incomplete) wiki page about
building indexes.
You will want to make a tsvector based on each expression that pg_search generates for your document. So you might notice that the expression for the dmetaphone part includes a call to pg_search_dmetaphone() mixed in somewhere between all the to_tsvector calls, the coalesce calls, any unaccent() calls, etc.
The main reason you need to have separate tsvectors is that the different expressions for the document part of the @@ parts of the where clause end up generating completely different tsvectors.
I hope this helps, I know it's a bit esoteric. Feel free to ask follow-up questions.