Pseudocode of my guess!
Select e.entityId,
a.name,
a.title,
a.address,
e.rank
From (
Select entityId, max(Rank) Rank
from (
Select
Top(50)
e.entityId
keyTable.Rank
From
entity e
inner join ContainsTable(srch_param, param_val, @contains_srch_param) as keyTable on e.entityId = keyTable.key
-- Order by keyTable.Rank desc (probably not needed)
Union
Select
Top(50)
e.entityId
keyTable.Rank
From
entity e
inner join FreeTextTable(srch_param, param_val, @freetext_srch_param) as keyTable on e.entityId = keyTable.key
-- Order by keyTable.Rank desc (probably not needed)
) ranking_subquery
Group by entityId
) e
join
entity a
on
e.entityId = a.entityId
Order by rank desc, name;
edit: Forgot a "group by"