elasticsearch_dsl/search/queries/specialized/
script_query.rs

1use crate::search::*;
2use crate::util::*;
3
4/// Filters documents based on a provided
5/// [script](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html).
6/// The script query is typically used in a
7/// [filter context](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html).
8///
9/// To create script query:
10/// ```
11/// # use elasticsearch_dsl::queries::*;
12/// # use elasticsearch_dsl::queries::params::*;
13/// # let query =
14/// Query::script(Script::source("return doc['amount'].value < 10;"));
15/// ```
16/// <https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.html>
17#[derive(Debug, Clone, PartialEq, Serialize)]
18#[serde(remote = "Self")]
19pub struct ScriptQuery {
20    script: Script,
21
22    #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
23    boost: Option<f32>,
24
25    #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
26    _name: Option<String>,
27}
28
29impl Query {
30    /// Creates an instance of [`ScriptQuery`]
31    ///
32    /// - `script` - Contains a script to run as a query. This script must
33    ///   return a boolean value, `true` or `false`
34    pub fn script(script: Script) -> ScriptQuery {
35        ScriptQuery {
36            script,
37            boost: None,
38            _name: None,
39        }
40    }
41}
42
43impl ScriptQuery {
44    add_boost_and_name!();
45}
46
47impl ShouldSkip for ScriptQuery {}
48
49serialize_with_root!("script": ScriptQuery);
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn serialization() {
57        assert_serialize_query(
58            Query::script(
59                Script::source("doc['numberOfCommits'].value > params.param1").param("param1", 50),
60            )
61            .name("_named_query")
62            .boost(1.1),
63            json!({
64                "script": {
65                    "_name": "_named_query",
66                    "boost": 1.1,
67                    "script": {
68                        "source": "doc['numberOfCommits'].value > params.param1",
69                        "params": {
70                            "param1": 50
71                        }
72                    }
73                }
74            }),
75        );
76    }
77}