| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | [[query-dsl-terms-set-query]]=== Terms set query++++<titleabbrev>Terms set</titleabbrev>++++Returns documents that contain a minimum number of *exact* terms in a providedfield.The `terms_set` query is the same as the <<query-dsl-terms-query, `terms`query>>, except you can define the number of matching terms required toreturn a document. For example:* A field, `programming_languages`, contains a list of known programminglanguages, such as `c++`, `java`, or `php` for job candidates. You can use the`terms_set` query to return documents that match at least two of theselanguages.* A field, `permissions`, contains a list of possible user permissions for anapplication. You can use the `terms_set` query to return documents thatmatch a subset of these permissions.[[terms-set-query-ex-request]]==== Example request[[terms-set-query-ex-request-index-setup]]===== Index setupIn most cases, you'll need to include a <<number, numeric>> field mapping inyour index to use the `terms_set` query. This numeric field contains thenumber of matching terms required to return a document.To see how you can set up an index for the `terms_set` query, try thefollowing example.. Create an index, `job-candidates`, with the following field mappings:+--* `name`, a <<keyword, `keyword`>> field. This field contains the name of thejob candidate.* `programming_languages`, a <<keyword, `keyword`>> field. This field containsprogramming languages known by the job candidate.* `required_matches`, a <<number, numeric>> `long` field. This field containsthe number of matching terms required to return a document.[source,js]----PUT /job-candidates{    "mappings": {        "properties": {            "name": {                "type": "keyword"            },            "programming_languages": {                "type": "keyword"            },            "required_matches": {                "type": "long"            }        }    }}----// CONSOLE// TESTSETUP--. Index a document with an ID of `1` and the following values:+--* `Jane Smith` in the `name` field.* `["c++", "java"]` in the `programming_languages` field.* `2` in the `required_matches` field.Include the `?refresh` parameter so the document is immediately available forsearch.[source,js]----PUT /job-candidates/_doc/1?refresh{    "name": "Jane Smith",    "programming_languages": ["c++", "java"],    "required_matches": 2}----// CONSOLE--. Index another document with an ID of `2` and the following values:+--* `Jason Response` in the `name` field.* `["java", "php"]` in the `programming_languages` field.* `2` in the `required_matches` field.[source,js]----PUT /job-candidates/_doc/2?refresh{    "name": "Jason Response",    "programming_languages": ["java", "php"],    "required_matches": 2}----// CONSOLE--You can now use the `required_matches` field value as the number ofmatching terms required to return a document in the `terms_set` query.[[terms-set-query-ex-request-query]]===== Example queryThe following search returns documents where the `programming_languages` fieldcontains at least two of the following terms:* `c++`* `java`* `php`The `minimum_should_match_field` is `required_matches`. This means thenumber of matching terms required is `2`, the value of the `required_matches`field.[source,js]----GET /job-candidates/_search{    "query": {        "terms_set": {            "programming_languages": {                "terms": ["c++", "java", "php"],                "minimum_should_match_field": "required_matches"            }        }    }}----// CONSOLE[[terms-set-top-level-params]]==== Top-level parameters for `terms_set``<field>`::(Required, object) Field you wish to search.[[terms-set-field-params]]==== Parameters for `<field>``terms`::+--(Required, array of strings) Array of terms you wish to find in the provided`<field>`. To return a document, a required number of terms must exactly matchthe field values, including whitespace and capitalization.The required number of matching terms is defined in the`minimum_should_match_field` or `minimum_should_match_script` parameter.--`minimum_should_match_field`::(Optional, string) <<number, Numeric>> field containing the number of matchingterms required to return a document.`minimum_should_match_script`::+--(Optional, string) Custom script containing the number of matching termsrequired to return a document.For parameters and valid values, see <<modules-scripting, Scripting>>.For an example query using the `minimum_should_match_script` parameter, see<<terms-set-query-script, How to use the `minimum_should_match_script`parameter>>.--[[terms-set-query-notes]]==== Notes[[terms-set-query-script]]===== How to use the `minimum_should_match_script` parameterYou can use `minimum_should_match_script` to define the required number ofmatching terms using a script. This is useful if you need to set the number ofrequired terms dynamically.[[terms-set-query-script-ex]]====== Example query using `minimum_should_match_script`The following search returns documents where the `programming_languages` fieldcontains at least two of the following terms:* `c++`* `java`* `php`The `source` parameter of this query indicates:* The required number of terms to match cannot exceed `params.num_terms`, thenumber of terms provided in the `terms` field.* The required number of terms to match is `2`, the value of the`required_matches` field.[source,js]----GET /job-candidates/_search{    "query": {        "terms_set": {            "programming_languages": {                "terms": ["c++", "java", "php"],                "minimum_should_match_script": {                   "source": "Math.min(params.num_terms, doc['required_matches'].value)"                },                "boost": 1.0            }        }    }}----// CONSOLE
 |