elasticsearch_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/elasticsearch/reference/current/modules-scripting.html)
3//! (based on different fields) for each hit.
4//!
5//! <https://www.elastic.co/guide/en/elasticsearch/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, 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 crate::{util::assert_serialize, Search};
40
41    use super::*;
42
43    #[test]
44    fn serializes_correctly() {
45        let subject = Search::new()
46            .script_fields(
47                "test1",
48                Script::source("doc['price'].value * 2").lang("painless"),
49            )
50            .script_fields(
51                "test2",
52                Script::source("doc['price'].value * params.factor")
53                    .lang("painless")
54                    .param("factor", 2.0),
55            )
56            .script_fields("test3", "params['_source']['message']");
57
58        let expectation = json!({
59            "script_fields": {
60                "test1": {
61                    "script": {
62                        "lang": "painless",
63                        "source": "doc['price'].value * 2"
64                    }
65                },
66                "test2": {
67                    "script": {
68                        "lang": "painless",
69                        "source": "doc['price'].value * params.factor",
70                        "params": {
71                            "factor": 2.0
72                        }
73                    }
74                },
75                "test3": {
76                    "script": {
77                        "source": "params['_source']['message']"
78                    }
79                }
80            }
81        });
82
83        assert_serialize(subject, expectation);
84    }
85}