elasticsearch_dsl/search/queries/compound/
constant_score_query.rs

1use crate::search::*;
2use crate::util::*;
3
4/// Wraps a [filter query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)
5/// and returns every matching document with a
6/// [relevance score](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#relevance-scores)
7/// equal to the `boost` parameter value.
8///
9/// To create constant score query:
10/// ```
11/// # use elasticsearch_dsl::queries::*;
12/// # use elasticsearch_dsl::queries::params::*;
13/// # let query =
14/// Query::constant_score(Query::term("test1", 123))
15///     .boost(3)
16///     .name("test");
17/// ```
18/// <https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-constant-score-query.html>
19#[derive(Debug, Clone, PartialEq, Serialize)]
20#[serde(remote = "Self")]
21pub struct ConstantScoreQuery {
22    filter: Box<Query>,
23
24    #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
25    boost: Option<f32>,
26
27    #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
28    _name: Option<String>,
29}
30
31impl Query {
32    /// Creates an instance of [`ConstantScoreQuery`]
33    ///
34    /// - `filter` - [Filter query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)
35    ///   you wish to run. Any returned documents must match this query.<br/>
36    ///   Filter queries do not calculate
37    ///   [relevance scores](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#relevance-scores).
38    ///   To speed up performance, Elasticsearch automatically caches frequently used filter queries.
39    pub fn constant_score<T>(filter: T) -> ConstantScoreQuery
40    where
41        T: Into<Query>,
42    {
43        ConstantScoreQuery {
44            filter: Box::new(filter.into()),
45            boost: None,
46            _name: None,
47        }
48    }
49}
50
51impl ConstantScoreQuery {
52    add_boost_and_name!();
53}
54
55impl ShouldSkip for ConstantScoreQuery {
56    fn should_skip(&self) -> bool {
57        self.filter.should_skip()
58    }
59}
60
61serialize_with_root!("constant_score": ConstantScoreQuery);
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn serialization() {
69        assert_serialize_query(
70            Query::constant_score(Query::term("test1", 123)),
71            json!({
72                "constant_score": {
73                    "filter": {
74                        "term": {
75                            "test1": {
76                                "value": 123
77                            }
78                        }
79                    }
80                }
81            }),
82        );
83
84        assert_serialize_query(
85            Query::constant_score(Query::term("test1", 123))
86                .boost(3)
87                .name("test"),
88            json!({
89                "constant_score": {
90                    "filter": {
91                        "term": {
92                            "test1": {
93                                "value": 123
94                            }
95                        }
96                    },
97                    "boost": 3.0,
98                    "_name": "test"
99                }
100            }),
101        );
102    }
103}