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 136 137 138 139 140 141 142 143 144
use crate::search::*;
use crate::util::*;
/// A `match_bool_prefix` query analyzes its input and constructs a
/// [`bool` query](crate::BoolQuery) from the terms. Each term except the last is used in a
/// [`term` query](crate::TermQuery). The last term is used in a
/// [`prefix` query](crate::PrefixQuery).
///
/// To create a MatchBoolPrefix query:
/// ```
/// # use elasticsearch_dsl::queries::*;
/// # use elasticsearch_dsl::queries::params::*;
/// # let query =
/// Query::match_bool_prefix("test", "search text")
/// .boost(2)
/// .name("test");
/// ```
/// <https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-bool-prefix-query.html>
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(remote = "Self")]
pub struct MatchBoolPrefixQuery {
#[serde(skip)]
field: String,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
query: Text,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
analyzer: Option<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
minimum_should_match: Option<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
operator: Option<Operator>,
#[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 [`MatchBoolPrefixQuery`]
///
/// - `field` - Field you wish to search.
/// - `query` - Text, number, boolean value or date you wish to find in the provided `<field>`
pub fn match_bool_prefix<T, U>(field: T, query: U) -> MatchBoolPrefixQuery
where
T: ToString,
U: Into<Text>,
{
MatchBoolPrefixQuery {
field: field.to_string(),
query: query.into(),
analyzer: None,
minimum_should_match: None,
operator: None,
boost: None,
_name: None,
}
}
}
impl MatchBoolPrefixQuery {
/// [Analyzer](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html)
/// used to convert the text in the `query` value into tokens. Defaults to the
/// [index-time analyzer](https://www.elastic.co/guide/en/elasticsearch/reference/current/specify-analyzer.html#specify-index-time-analyzer)
/// mapped for the `<field>`. If no analyzer is mapped, the index’s default analyzer is used.
pub fn analyzer<T>(mut self, analyzer: T) -> Self
where
T: ToString,
{
self.analyzer = Some(analyzer.to_string());
self
}
/// Minimum number of clauses that must match for a document to be returned. See the
/// `minimum_should_match` parameter for valid values and more information.
pub fn minimum_should_match<T>(mut self, minimum_should_match: T) -> Self
where
T: ToString,
{
self.minimum_should_match = Some(minimum_should_match.to_string());
self
}
/// Boolean logic used to interpret text in the `query` value
pub fn operator(mut self, operator: Operator) -> Self {
self.operator = Some(operator);
self
}
add_boost_and_name!();
}
impl ShouldSkip for MatchBoolPrefixQuery {
fn should_skip(&self) -> bool {
self.query.should_skip()
}
}
serialize_with_root_keyed!("match_bool_prefix": MatchBoolPrefixQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::match_bool_prefix("test", "search text"),
json!({
"match_bool_prefix": {
"test": {
"query": "search text"
}
}
}),
);
assert_serialize_query(
Query::match_bool_prefix("test", "search text")
.analyzer("search_time_analyzer")
.minimum_should_match("12")
.operator(Operator::Or)
.boost(2)
.name("test"),
json!({
"match_bool_prefix": {
"test": {
"query": "search text",
"analyzer": "search_time_analyzer",
"minimum_should_match": "12",
"operator": "OR",
"boost": 2.0,
"_name": "test"
}
}
}),
);
}
}