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}