Using LEFT [OUTER] JOIN
we don't exclude rows without relatives in the joined tables.
By aggregating multiple rows before joining we avoid the cross-multiplication of rows.
I concatenate the string with concat_ws()
(which ignores potential NULL values from any of the contributing sources) and call to_tsvector()
only once, which should be a bit cheaper.