So, I've just read https://www.elastic.co/blog/index-type-parent-child-join-now-future-in-elasticsearch and related articles. While this may seem like a logical change to you from the inside, from my app's point of view, it looks like a complete rewrite. I'm just astonished and daunted by the work that would be required, with apparently no additional value to my app.
I have what is essentially a conventional database application which uses Elasticsearch as the database in order to take advantage of the excellent search facilities. I have many diverse types: it's probably the antithesis of the cases you are thinking about. I have some types which have a lot in common, for example four different kinds of person which share many fields (called new, current, old, contact) and communications (pendingemails, sentemails, letters). Then I have many others which have nothing in common.
Generally I don't use ES _id's to link documents together: most of the time I use certain fields (like 'membershipnumber' which are my own identifiers, and sometimes a combination of fields. I rarely look up individual records by _id, more usually by a search which can have only one result.
If I understand your articles correctly, I should redistribute the more distinct types among separate indexes, and merge the ones with more commonality. The former case is a big code change but largely mechanical I guess. But testing it would be a huge burden. It would be helpful to have a way to group indexes in this case. I store several database instances as separate indexes which I'd want to keep more distinct than the new indexes which make up a single database. I don't believe I can have the same server behave as a separate cluster, can I? So I'm left with using, say, name prefixes for indexes to distinguish separate "databases" as it stands.
With the common ones, I'd still have to be able to tell the "types" apart (with my own "type" field presumably) and search selectively on one or more of them, which means most searches would have to become boolean searches on top of the existing search, whereas currently I can just put a comma-separated list of which types I want, and most often just the one type. Furthermore, currently using strict mapping, I can ensure the distinct fields from say "old" can't be accidentally present in say "new". If I can't distinguish them any more, this valuable feature you introduced in v5 is lost to me (unless I use separate indexes for these too, but that makes cross-type searching even harder).
Allowing existing indexes to continue for one more version doesn't really help much as reloading to re-index or move tot he new version then becomes impossible. Or even moving things between one server and another. Or installing a new instance of the app.
The scale of change involved here in this grossly non-upward-compatibility is so large that it will drive me to consider whether I should replace ES altogether with a more stable database back end. It would probably be no harder to put in an entirely different database backend that uses JSON objects, as that's essentially what you're intending. If you're going to do this to me now, why would I not fear that I'd have the same upheaval another version down the line, and again after that. I can devote my resources to chasing ES changes, or to improving my app. Which would you choose?
If it had been this way from the start, I'd have coded it that way in the first place, and all would be well. But pulling the rug from under my feet in this way with a mature app is just awful.
The thing is, despite your protestations about sparseness and how fields are stored and indexed, it works really well for me. Maybe if I was storing tens of millions of records I'd start to suffer, but I'm only dealing with tens or hundreds of thousands.
One thing that I have long thought would be a help is a class hierarchy for types, and if objects that share a lot in common are to be made more common, and others less so, this would seem even more appropriate. Currently my mappings have the same fields repeated multiple times in similar types. It would be helpful (though probably not at the expense of a rupture like you're intending) if I could list the common fields and then as I get more specific, inherit the common ones and add the new type-specific fields, thereby explicitly recognising the commonality.
I am just flabbergasted. Or I have completely misunderstood what you're intending!