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.
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.
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"
}
}
}
}
-
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.
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.
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
}
}
}
}