Skip to main content

opensearch_dsl/search/queries/specialized/
script_query.rs

1use crate::{search::*, util::*};
2
3/// Filters documents based on a provided
4/// [script](https://www.elastic.co/guide/en/opensearch/reference/current/modules-scripting-using.html).
5/// The script query is typically used in a
6/// [filter context](https://www.elastic.co/guide/en/opensearch/reference/current/query-filter-context.html).
7///
8/// To create script query:
9/// ```
10/// # use opensearch_dsl::queries::*;
11/// # use opensearch_dsl::queries::params::*;
12/// # let query =
13/// Query::script(Script::source("return doc['amount'].value < 10;"));
14/// ```
15/// <https://www.elastic.co/guide/en/opensearch/reference/current/query-dsl-script-query.html>
16#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
17#[serde(remote = "Self")]
18pub struct ScriptQuery {
19    script: Script,
20
21    #[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
22    boost: Option<f32>,
23
24    #[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
25    _name: Option<String>,
26}
27
28impl Query {
29    /// Creates an instance of [`ScriptQuery`]
30    ///
31    /// - `script` - Contains a script to run as a query. This script must
32    /// return a boolean value, `true` or `false`
33    pub fn script(script: Script) -> ScriptQuery {
34        ScriptQuery {
35            script,
36            boost: None,
37            _name: None,
38        }
39    }
40}
41
42impl ScriptQuery {
43    add_boost_and_name!();
44}
45
46impl ShouldSkip for ScriptQuery {}
47
48serialize_with_root!("script": ScriptQuery);
49deserialize_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}