1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
use crate::search::*;
use crate::util::*;
use serde::Serialize;
/// Returns documents that contain an **exact** terms_set in a provided field.
///
/// You can use the terms_set query to find documents based on a precise value such as a price, a product ID, or a username.
///
/// To create a terms_set query with numeric field:
/// ```
/// # use elasticsearch_dsl::queries::*;
/// # use elasticsearch_dsl::queries::params::*;
/// # let query =
/// Query::terms_set("test", [123], "required_matches");
/// ```
///
/// To create a terms_set query with script:
/// ```
/// # use elasticsearch_dsl::queries::*;
/// # use elasticsearch_dsl::queries::params::*;
/// # let query =
/// Query::terms_set(
/// "test",
/// [123],
/// TermsSetScript::new("Math.min(params.num_terms_sets, doc['required_matches'].value)")
/// .params(serde_json::json!({"num_terms_sets": 2}))
/// );
/// ```
/// <https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-set-query.html>
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(remote = "Self")]
pub struct TermsSetQuery {
#[serde(skip)]
field: String,
terms: Terms,
#[serde(flatten)]
minimum_should_match: TermsSetMinimumShouldMatch,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boost: Option<f32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
_name: Option<String>,
}
impl Query {
/// Creates an instance of [`TermsSetQuery`]
///
/// - `field` - Field you wish to search.
/// - `value` - TermsSet you wish to find in the provided field.
/// To return a document, the terms_set must exactly match the field value, including whitespace and capitalization.
pub fn terms_set<S, T, U>(field: S, terms: T, minimum_should_match: U) -> TermsSetQuery
where
S: ToString,
T: Into<Terms>,
U: Into<TermsSetMinimumShouldMatch>,
{
TermsSetQuery {
field: field.to_string(),
terms: terms.into(),
minimum_should_match: minimum_should_match.into(),
boost: None,
_name: None,
}
}
}
impl TermsSetQuery {
add_boost_and_name!();
}
impl ShouldSkip for TermsSetQuery {
fn should_skip(&self) -> bool {
self.terms.should_skip()
}
}
serialize_with_root_keyed!("terms_set": TermsSetQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::terms_set("test", [123], "required_matches"),
json!({
"terms_set": {
"test": {
"terms": [123],
"minimum_should_match_field": "required_matches"
}
}
}),
);
assert_serialize_query(
Query::terms_set(
"programming_languages",
["c++", "java", "php"],
TermsSetScript::new(
"Math.min(params.num_terms_sets, doc['required_matches'].value)",
)
.params(json!({"num_terms_sets": 2})),
)
.boost(2)
.name("test"),
json!({
"terms_set": {
"programming_languages": {
"terms": ["c++", "java", "php"],
"minimum_should_match_script": {
"source": "Math.min(params.num_terms_sets, doc['required_matches'].value)",
"params": {
"num_terms_sets": 2
}
},
"boost": 2.0,
"_name": "test"
}
}
}),
);
}
}