use crate::search::*;
use crate::util::*;
use crate::Map;
use crate::Set;
#[derive(Debug, Default, Clone, Serialize, PartialEq)]
pub struct Search {
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
runtime_mappings: Map<String, RuntimeMapping>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
indices_boost: Vec<KeyValuePair<String, f32>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
min_score: Option<f32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
_source: Option<SourceFilter>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
stats: Vec<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
from: Option<u64>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
size: Option<u64>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
query: Option<Query>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
sort: SortCollection,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
aggs: Aggregations,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
track_total_hits: Option<TrackTotalHits>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
highlight: Option<Highlight>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
rescore: RescoreCollection,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
suggest: Map<String, Suggester>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
stored_fields: StoredFields,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
docvalue_fields: Set<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
script_fields: Map<String, ScriptField>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
post_filter: Option<Query>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
pit: Option<PointInTime>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
search_after: Terms,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
timeout: Option<Time>,
}
impl Search {
pub fn new() -> Self {
Self::default()
}
pub fn runtime_mapping<S>(mut self, name: S, mapping: RuntimeMapping) -> Self
where
S: ToString,
{
let _ = self.runtime_mappings.insert(name.to_string(), mapping);
self
}
pub fn script_fields<S, T>(mut self, name: S, script: T) -> Self
where
S: ToString,
T: Into<ScriptField>,
{
let _ = self.script_fields.insert(name.to_string(), script.into());
self
}
pub fn indices_boost<T, U>(mut self, field: T, boost: U) -> Self
where
T: ToString,
U: num_traits::AsPrimitive<f32>,
{
self.indices_boost
.push(KeyValuePair::new(field.to_string(), boost.as_()));
self
}
pub fn min_score<F>(mut self, min_score: F) -> Self
where
F: Into<f32>,
{
self.min_score = Some(min_score.into());
self
}
pub fn source<S>(mut self, source: S) -> Self
where
S: Into<SourceFilter>,
{
self._source = Some(source.into());
self
}
pub fn stats<S>(mut self, stats: S) -> Self
where
S: ToString,
{
self.stats.push(stats.to_string());
self
}
pub fn from(mut self, from: u64) -> Self {
self.from = Some(from);
self
}
pub fn size(mut self, size: u64) -> Self {
self.size = Some(size);
self
}
pub fn query<Q>(mut self, query: Q) -> Self
where
Q: Into<Query>,
{
self.query = Some(query.into());
self
}
pub fn post_filter<Q>(mut self, post_filter: Q) -> Self
where
Q: Into<Query>,
{
self.post_filter = Some(post_filter.into());
self
}
pub fn sort<T>(mut self, sort: T) -> Self
where
T: IntoIterator,
T::Item: Into<Sort>,
{
self.sort.extend(sort);
self
}
pub fn track_total_hits<T>(mut self, track_total_hits: T) -> Self
where
T: Into<TrackTotalHits>,
{
self.track_total_hits = Some(track_total_hits.into());
self
}
pub fn highlight<H>(mut self, highlight: H) -> Self
where
H: Into<Highlight>,
{
self.highlight = Some(highlight.into());
self
}
pub fn rescore<T>(mut self, rescore: T) -> Self
where
T: IntoIterator,
T::Item: Into<Rescore>,
{
self.rescore.extend(rescore);
self
}
pub fn suggest<T, U>(mut self, name: T, suggester: U) -> Self
where
T: ToString,
U: Into<Suggester>,
{
let _ = self.suggest.insert(name.to_string(), suggester.into());
self
}
pub fn stored_fields<T>(mut self, stored_fields: T) -> Self
where
T: Into<StoredFields>,
{
self.stored_fields = stored_fields.into();
self
}
pub fn docvalue_fields<T>(mut self, docvalue_fields: T) -> Self
where
T: IntoIterator,
T::Item: ToString,
{
self.docvalue_fields
.extend(docvalue_fields.into_iter().map(|x| x.to_string()));
self
}
pub fn pit(mut self, pit: PointInTime) -> Self {
self.pit = Some(pit);
self
}
pub fn search_after<T>(mut self, sort_values: T) -> Self
where
T: Into<Terms>,
{
self.search_after = sort_values.into();
self
}
pub fn timeout<T>(mut self, timeout: T) -> Self
where
T: Into<Time>,
{
self.timeout = Some(timeout.into());
self
}
add_aggregate!();
}