### 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/test/java/org/elasticsearch/index/query/TermsSetQueryBuilderTests.java
SearchExecutionContext context = createSearchExecutionContext();
                Query query = new TermsSetQueryBuilder("message", Arrays.asList("c", "d")).setMinimumShouldMatchField("m_s_m")
                    .doToQuery(context);
                IndexSearcher searcher = new IndexSearcher(ir);
                TopDocs topDocs = searcher.search(query, 10, new Sort(SortField.FIELD_DOC));
                assertThat(topDocs.totalHits.value, equalTo(3L));
                assertThat(topDocs.scoreDocs[0].doc, equalTo(1));
                assertThat(topDocs.scoreDocs[1].doc, equalTo(3));
                assertThat(topDocs.scoreDocs[2].doc, equalTo(4));
            }
        }
    }
    public void testDoToQuery_msmScriptField() throws Exception {
        try (Directory directory = newDirectory()) {
            IndexWriterConfig config = new IndexWriterConfig(new WhitespaceAnalyzer());
            config.setMergePolicy(NoMergePolicy.INSTANCE);
            try (IndexWriter iw = new IndexWriter(directory, config)) {
                Document document = new Document();
                document.add(new TextField("message", "a b x y", Field.Store.NO));
                document.add(new SortedNumericDocValuesField("m_s_m", 50));
                iw.addDocument(document);
                document = new Document();
                document.add(new TextField("message", "a b x y", Field.Store.NO));
                document.add(new SortedNumericDocValuesField("m_s_m", 75));
                iw.addDocument(document);
                document = new Document();
                document.add(new TextField("message", "a b c x", Field.Store.NO));
                document.add(new SortedNumericDocValuesField("m_s_m", 75));
                iw.addDocument(document);
                document = new Document();