1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
use crate::search::*;
use crate::util::*;
use serde::Serialize;
/// Returns documents that contain a specific prefix in a provided field.
///
/// To create a prefix query with numeric values:
/// ```
/// # use elasticsearch_dsl::queries::*;
/// # use elasticsearch_dsl::queries::params::*;
/// # let query =
/// Query::prefix("test", 123);
/// ```
/// To create a prefix query with string values and optional fields:
/// ```
/// # use elasticsearch_dsl::queries::*;
/// # use elasticsearch_dsl::queries::params::*;
/// # let query =
/// Query::prefix("test", "username")
/// .boost(2)
/// .name("test");
/// ```
/// <https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html>
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(remote = "Self")]
pub struct PrefixQuery {
#[serde(skip_serializing)]
field: String,
value: Option<Term>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
rewrite: Option<Rewrite>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
case_insensitive: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boost: Option<f32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
_name: Option<String>,
}
impl Query {
/// Creates an instance of [`PrefixQuery`]
///
/// - `field` - Field you wish to search.
/// - `value` - Term you wish to find in the provided field.
/// To return a document, the term must exactly match the field value, including whitespace and capitalization.
pub fn prefix<T, U>(field: T, value: U) -> PrefixQuery
where
T: ToString,
U: Serialize,
{
PrefixQuery {
field: field.to_string(),
value: Term::new(value),
rewrite: None,
case_insensitive: None,
boost: None,
_name: None,
}
}
}
impl PrefixQuery {
/// Method used to rewrite the query. For valid values and more information, see the
/// [rewrite](Rewrite) parameter.
pub fn rewrite(mut self, rewrite: Rewrite) -> Self {
self.rewrite = Some(rewrite);
self
}
/// Allows ASCII case insensitive matching of the value with the indexed field values when set
/// to true. Default is false which means the case sensitivity of matching depends on the
/// underlying field’s mapping.
pub fn case_insensitive(mut self, case_insensitive: bool) -> Self {
self.case_insensitive = Some(case_insensitive);
self
}
add_boost_and_name!();
}
impl ShouldSkip for PrefixQuery {
fn should_skip(&self) -> bool {
self.value.should_skip()
}
}
serialize_with_root_keyed!("prefix": PrefixQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::prefix("test", 123),
json!({
"prefix": {
"test": {
"value": 123
}
}
}),
);
assert_serialize_query(
Query::prefix("test", 123)
.rewrite(Rewrite::ConstantScore)
.case_insensitive(true)
.boost(2)
.name("test"),
json!({
"prefix": {
"test": {
"value": 123,
"rewrite": "constant_score",
"case_insensitive": true,
"boost": 2.0,
"_name": "test"
}
}
}),
);
assert_serialize_query(
Query::bool().filter(Query::prefix("test", None::<String>)),
json!({ "bool": {} }),
)
}
}