Terms set query
Returns documents that contain a minimum number of exact terms in a provided field.
The terms_set query is the same as the terms query, except you can define the number of matching terms required to return a document. For example:
- A field,
programming_languages, contains a list of known programming languages, such asc++,java, orphpfor job candidates. You can use theterms_setquery to return documents that match at least two of these languages. - A field,
permissions, contains a list of possible user permissions for an application. You can use theterms_setquery to return documents that match a subset of these permissions.
Example request
Index setup
In most cases, you’ll need to include a numeric field mapping in your index to use the terms_set query. This numeric field contains the number of matching terms required to return a document.
To see how you can set up an index for the terms_set query, try the following example.
-
Create an index,
job-candidates, with the following field mappings:-
name, akeywordfield. This field contains the name of the job candidate. -
programming_languages, akeywordfield. This field contains programming languages known by the job candidate. -
required_matches, a numericlongfield. This field contains the number of matching terms required to return a document.
PUT /job-candidates { "mappings": { "properties": { "name": { "type": "keyword" }, "programming_languages": { "type": "keyword" }, "required_matches": { "type": "long" } } } } -
-
Index a document with an ID of
1and the following values:-
Jane Smithin thenamefield. -
["c++", "java"]in theprogramming_languagesfield. -
2in therequired_matchesfield.
Include the
?refreshparameter so the document is immediately available for search.PUT /job-candidates/_doc/1?refresh { "name": "Jane Smith", "programming_languages": [ "c++", "java" ], "required_matches": 2 } -
-
Index another document with an ID of
2and the following values:-
Jason Responsein thenamefield. -
["java", "php"]in theprogramming_languagesfield. -
2in therequired_matchesfield.
PUT /job-candidates/_doc/2?refresh { "name": "Jason Response", "programming_languages": [ "java", "php" ], "required_matches": 2 } -
You can now use the required_matches field value as the number of matching terms required to return a document in the terms_set query.
Example query
The following search returns documents where the programming_languages field contains at least two of the following terms:
-
c++ -
java -
php
The minimum_should_match_field is required_matches. This means the number of matching terms required is 2, the value of the required_matches field.
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": [ "c++", "java", "php" ],
"minimum_should_match_field": "required_matches"
}
}
}
} Top-level parameters for terms_set
-
<field> - (Required, object) Field you wish to search.
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 match the field values, including whitespace and capitalization.The required number of matching terms is defined in the
minimum_should_match_fieldorminimum_should_match_scriptparameter. -
minimum_should_match_field - (Optional, string) Numeric field containing the number of matching terms required to return a document.
-
minimum_should_match_script -
(Optional, string) Custom script containing the number of matching terms required to return a document.
For parameters and valid values, see Scripting.
For an example query using the
minimum_should_match_scriptparameter, see How to use theminimum_should_match_scriptparameter.
Notes
How to use the minimum_should_match_script parameter
You can use minimum_should_match_script to define the required number of matching terms using a script. This is useful if you need to set the number of required terms dynamically.
Example query using minimum_should_match_script
The following search returns documents where the programming_languages field contains 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, the number of terms provided in thetermsfield. - The required number of terms to match is
2, the value of therequired_matchesfield.
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
}
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-terms-set-query.html