--- layout: default title: Terms set parent: Term-level queries nav_order: 30 --- # Terms set query With a terms set query, you can search for documents that match a minimum number of exact terms in a specified field. A `terms_set` query is similar to a `terms` query, except that you can specify the minimum number of matching terms that are required in order to return a document. You can specify this number either in a field in the index or with a script. As an example, consider an index that contains names of students and classes those students have taken. When setting up the mapping for this index, you need to provide a [numeric]({{site.url}}{{site.baseurl}}/opensearch/supported-field-types/numeric/) field that specifies the minimum number of matching terms that are required in order to return a document: ```json PUT students { "mappings": { "properties": { "name": { "type": "keyword" }, "classes": { "type": "keyword" }, "min_required": { "type": "integer" } } } } ``` {% include copy-curl.html %} Next, index two documents that correspond to students: ```json PUT students/_doc/1 { "name": "Mary Major", "classes": [ "CS101", "CS102", "MATH101" ], "min_required": 2 } ``` {% include copy-curl.html %} ```json PUT students/_doc/2 { "name": "John Doe", "classes": [ "CS101", "MATH101", "ENG101" ], "min_required": 2 } ``` {% include copy-curl.html %} Now search for students who have taken at least two of the following classes: `CS101`, `CS102`, `MATH101`: ```json GET students/_search { "query": { "terms_set": { "classes": { "terms": [ "CS101", "CS102", "MATH101" ], "minimum_should_match_field": "min_required" } } } } ``` {% include copy-curl.html %} The response contains both documents: ```json { "took" : 44, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.4544616, "hits" : [ { "_index" : "students", "_id" : "1", "_score" : 1.4544616, "_source" : { "name" : "Mary Major", "classes" : [ "CS101", "CS102", "MATH101" ], "min_required" : 2 } }, { "_index" : "students", "_id" : "2", "_score" : 0.5013843, "_source" : { "name" : "John Doe", "classes" : [ "CS101", "MATH101", "ENG101" ], "min_required" : 2 } } ] } } ``` To specify the minimum number of terms a document should match with a script, provide the script in the `minimum_should_match_script` field: ```json GET students/_search { "query": { "terms_set": { "classes": { "terms": [ "CS101", "CS102", "MATH101" ], "minimum_should_match_script": { "source": "Math.min(params.num_terms, doc['min_required'].value)" } } } } } ``` {% include copy-curl.html %} ## Parameters The query accepts the name of the field (``) as a top-level parameter: ```json GET _search { "query": { "terms_set": { "": { "terms": [ "term1", "term2" ], ... } } } } ``` {% include copy-curl.html %} The `` accepts the following parameters. All parameters except `terms` are optional. Parameter | Data type | Description :--- | :--- | :--- `terms` | Array of strings | The array of terms to search for in the field specified in ``. A document is returned in the results only if the required number of terms matches the document's field values exactly, with the correct spacing and capitalization. `minimum_should_match_field` | String | The name of the [numeric]({{site.url}}{{site.baseurl}}/mappings/supported-field-types/numeric/) field that specifies the number of matching terms required in order to return a document in the results. You must specify either `minimum_should_match_field` or `minimum_should_match_script`, but not both. `minimum_should_match_script` | String | A script that returns the number of matching terms required in order to return a document in the results. You must specify either `minimum_should_match_field` or `minimum_should_match_script`, but not both. `boost` | Floating-point | A floating-point value that specifies the weight of this field toward the relevance score. Values above 1.0 increase the field’s relevance. Values between 0.0 and 1.0 decrease the field’s relevance. Default is 1.0.