You are definitely right, GetItem
on every result would completely defy the purpose of having an index in place and should be avoided.
Essentially nothing has changed. The information you link to is correct, although I prefer the original post on the subject which is focused entirely on a vanilla Sitecore. And as far as I can tell, everything in that article still holds true for Sitecore 8.
I don't have a Sitecore 8.2u5 on hand right now, but in 8.2u2 the code for the calculated _templates
field looks like this. And as such, still only selects 1 layer of BaseTemplates for any item it indexes.
IEnumerable<string> collection = ((IEnumerable<TemplateItem>)item.Template.BaseTemplates)
.Select<TemplateItem, string>((Func<TemplateItem, string>)
(item2 => IdHelper.NormalizeGuid(item2.ID)));
Code taken with dotPeek tends to sometimes be a bit hard on the eyes, but in essence this code would need to be recursive, to grab all the base templates in play. And it isn't.
Essentially, you need to create your own computed field that recursively works through BaseTemplates on the item - taking care that you don't end up in an endless recursive loop by circling over the same template more than once. Then use your computed field instead of the OOTB one supplied by Sitecore.