### Description

The [Terms Set Query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-set-query.html) lets you match documents that have some minimum number of matches to a given array of input search terms. The minimum number of matches however can only be specified by referencing another field on the document or by using a script.  

I have a use case where I need to be able to specify the minimum number of terms to match at query time, agnostic of documents so the `minimum_should_match_field` is not useful. Further, since I know I need to match a minimum of exactly, say, 3 terms, it seems like overkill to have to enable and using scripting (as in the use of `minimum_should_match_script`) to just return a static number.

Today as an alternative, I'm instead using a Bool Query with a `minimum_should_match` accepting my explicit number and all of my input search terms mapping to an array of individual `{ term: { field: value } }` entries in the `should` array of the bool. However, this is very json-inefficient, especially when I am making queries with many (possibly thousands) of terms in my query.

I was so happy to find the Terms Set query as a leaner, more specialized alternative to my massive `should` array but was then very surprised that there was no query-time input for the minimum match count (outside scripting).

**TL;DR:** Terms Set query should support a third possible top-level parameter for specifying the minimum number of terms to match which simply accepts a number, like `minimum_should_match`
server/src/main/java/org/elasticsearch/TransportVersion.java
* <p>
 * The earliest CCS compatible version is hardcoded at {@link #MINIMUM_CCS_VERSION}, as the transport version used by the previous minor
 * release. This should be updated appropriately whenever a minor release happens.
 * <h2>Adding a new version</h2>
 * A new transport version should be added <em>every time</em> a change is made to the serialization protocol of one or more classes. Each
 * transport version should only be used in a single merged commit (apart from BwC versions copied from {@link Version}).
 * <p>
 * To add a new transport version, add a new constant at the bottom of the list that is one greater than the current highest version, ensure
 * it has a unique id, and update the {@link CurrentHolder#CURRENT} constant to point to the new version.
 * <h2>Reverting a transport version</h2>
 * If you revert a commit with a transport version change, you <em>must</em> ensure there is a <em>new</em> transport version representing
 * the reverted change. <em>Do not</em> let the transport version go backwards, it must <em>always</em> be incremented.
 * <h2>Scope of usefulness of {@link TransportVersion}</h2>
 * {@link TransportVersion} is a property of the transport connection between a pair of nodes, and should not be used as an indication of
 * the version of any single node. The {@link TransportVersion} of a connection is negotiated between the nodes via some logic that is not
 * totally trivial, and may change in future. Any other places that might make decisions based on this version effectively have to reproduce
 * this negotiation logic, which would be fragile. If you need to make decisions based on the version of a single node, do so using a
 * different version value. If you need to know whether the cluster as a whole speaks a new enough {@link TransportVersion} to understand a
 * newly-added feature, use {@link org.elasticsearch.cluster.ClusterState#getMinTransportVersion}.
 */
public record TransportVersion(int id) implements VersionId<TransportVersion> {
    /*
     * NOTE: IntelliJ lies!
     * This map is used during class construction, referenced by the registerTransportVersion method.
     * When all the transport version constants have been registered, the map is cleared & never touched again.
     */
    private static Map<String, Integer> IDS = new HashMap<>();
    private static TransportVersion registerTransportVersion(int id, String uniqueId) {
        if (IDS == null) throw new IllegalStateException("The IDS map needs to be present to call this method");
        Strings.requireNonEmpty(uniqueId, "Each TransportVersion needs a unique string id");