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}