Thanks for the reply, Jörg. Well, in my case, I won't be removing fields, just changing the mapping for some fields. For the sake of clarity, I'll use this example: type_a.user_id is an integer and type_b.user_id is a long, and I want to change type_b.user_id to be an integer.
By re-indexing only some documents, what I mean is: exporting all type_b documents that contain a user_id field, deleting those documents from the database, forcibly changing the mapping for type_b.user_id to integer, then indexing the exported documents again. It seems like it should work from a technical perspective, but I admit my knowledge of ES and Lucene internals is minimal. I think that is what you mean by "repairing the mapping on ES level", so I guess we're in agreement.
I think the dynamic mapper is what is hurting me the most. I have a template that contains a mapping with no field conflicts, but occasionally other data slips in that isn't in the template, and the dynamic mapper adds the wrong data types to the mapping. I'm beginning to think that the dynamic mapper is evil and I should turn it off! I previously thought that dynamically indexed data is better than missing data, but now I'm not so sure.