Skip to main content

opensearch_dsl/search/script_fields/
mod.rs

1//! You can use the `script_fields` parameter to retrieve a
2//! [script evaluation](https://www.elastic.co/guide/en/opensearch/reference/current/modules-scripting.html)
3//! (based on different fields) for each hit.
4//!
5//! <https://www.elastic.co/guide/en/opensearch/reference/current/search-fields.html#script-fields>
6
7use crate::Script;
8
9/// A script to calculate field value from the `_source` fields
10#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
11pub struct ScriptField {
12    script: Script,
13}
14
15impl From<Script> for ScriptField {
16    fn from(value: Script) -> Self {
17        Self { script: value }
18    }
19}
20
21impl From<&str> for ScriptField {
22    fn from(value: &str) -> Self {
23        Self {
24            script: Script::source(value),
25        }
26    }
27}
28
29impl From<String> for ScriptField {
30    fn from(value: String) -> Self {
31        Self {
32            script: Script::source(value),
33        }
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    use crate::{util::assert_serialize, Search};
41
42    #[test]
43    fn serializes_correctly() {
44        let subject = Search::new()
45            .script_fields(
46                "test1",
47                Script::source("doc['price'].value * 2").lang("painless"),
48            )
49            .script_fields(
50                "test2",
51                Script::source("doc['price'].value * params.factor")
52                    .lang("painless")
53                    .param("factor", 2.0),
54            )
55            .script_fields("test3", "params['_source']['message']");
56
57        let expectation = json!({
58            "script_fields": {
59                "test1": {
60                    "script": {
61                        "lang": "painless",
62                        "source": "doc['price'].value * 2"
63                    }
64                },
65                "test2": {
66                    "script": {
67                        "lang": "painless",
68                        "source": "doc['price'].value * params.factor",
69                        "params": {
70                            "factor": 2.0
71                        }
72                    }
73                },
74                "test3": {
75                    "script": {
76                        "source": "params['_source']['message']"
77                    }
78                }
79            }
80        });
81
82        assert_serialize(subject, expectation);
83    }
84}