use crate::search::*;
use crate::util::*;
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(untagged)]
pub enum Highlighter {
Default(DefaultHighlighter),
Fvh(FastVectorHighlighter),
Plain(PlainHighlighter),
Unified(UnifiedHighlighter),
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct DefaultHighlighter {
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_chars: Option<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_max_scan: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
encoder: Option<Encoder>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
force_source: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
fragment_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
highlight_query: Option<Query>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
no_match_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
number_of_fragments: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
order: Option<Order>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
pre_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
post_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
require_field_match: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip", flatten)]
tags: Option<Tags>,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct FastVectorHighlighter {
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_chars: Option<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_max_scan: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
encoder: Option<Encoder>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
force_source: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
fragment_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
highlight_query: Option<Query>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
no_match_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
number_of_fragments: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
order: Option<Order>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
pre_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
post_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
require_field_match: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip", flatten)]
tags: Option<Tags>,
r#type: &'static str,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_scanner: Option<FvhBoundaryScanner>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
fragment_offset: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
matched_fields: Option<MatchedFields>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
phrase_limit: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct PlainHighlighter {
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_chars: Option<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_max_scan: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
encoder: Option<Encoder>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
force_source: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
fragment_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
highlight_query: Option<Query>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
no_match_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
number_of_fragments: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
order: Option<Order>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
pre_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
post_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
require_field_match: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip", flatten)]
tags: Option<Tags>,
r#type: &'static str,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
fragmenter: Option<Fragmenter>,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct UnifiedHighlighter {
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_chars: Option<String>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boundary_max_scan: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
encoder: Option<Encoder>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
force_source: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
fragment_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
highlight_query: Option<Query>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
no_match_size: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
number_of_fragments: Option<u32>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
order: Option<Order>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
pre_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
post_tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
require_field_match: Option<bool>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip", flatten)]
tags: Option<Tags>,
r#type: &'static str,
#[serde(skip_serializing_if = "ShouldSkip::should_skip", flatten)]
boundary_scanner: Option<UnifiedBoundaryScanner>,
}
impl Default for Highlighter {
fn default() -> Self {
Self::Default(Default::default())
}
}
impl Highlighter {
#[allow(clippy::new_ret_no_self)]
pub fn new() -> DefaultHighlighter {
Default::default()
}
pub fn fvh() -> FastVectorHighlighter {
FastVectorHighlighter::default()
}
pub fn plain() -> PlainHighlighter {
PlainHighlighter::default()
}
pub fn unified() -> UnifiedHighlighter {
UnifiedHighlighter::default()
}
}
impl Default for FastVectorHighlighter {
fn default() -> Self {
Self {
r#type: "fvh",
boundary_chars: None,
boundary_max_scan: None,
encoder: None,
force_source: None,
fragment_size: None,
highlight_query: None,
no_match_size: None,
number_of_fragments: None,
order: None,
pre_tags: None,
post_tags: None,
require_field_match: None,
tags: None,
boundary_scanner: None,
fragment_offset: None,
matched_fields: None,
phrase_limit: None,
}
}
}
impl Default for PlainHighlighter {
fn default() -> Self {
Self {
r#type: "plain",
boundary_chars: None,
boundary_max_scan: None,
encoder: None,
force_source: None,
fragment_size: None,
highlight_query: None,
no_match_size: None,
number_of_fragments: None,
order: None,
pre_tags: None,
post_tags: None,
require_field_match: None,
tags: None,
fragmenter: None,
}
}
}
impl Default for UnifiedHighlighter {
fn default() -> Self {
Self {
r#type: "unified",
boundary_chars: None,
boundary_max_scan: None,
encoder: None,
force_source: None,
fragment_size: None,
highlight_query: None,
no_match_size: None,
number_of_fragments: None,
order: None,
pre_tags: None,
post_tags: None,
require_field_match: None,
tags: None,
boundary_scanner: None,
}
}
}
impl From<DefaultHighlighter> for Highlighter {
fn from(highlighter: DefaultHighlighter) -> Self {
Self::Default(highlighter)
}
}
impl From<FastVectorHighlighter> for Highlighter {
fn from(highlighter: FastVectorHighlighter) -> Self {
Self::Fvh(highlighter)
}
}
impl From<PlainHighlighter> for Highlighter {
fn from(highlighter: PlainHighlighter) -> Self {
Self::Plain(highlighter)
}
}
impl From<UnifiedHighlighter> for Highlighter {
fn from(highlighter: UnifiedHighlighter) -> Self {
Self::Unified(highlighter)
}
}
macro_rules! add_highlighter_methods {
() => {
pub fn boundary_chars<T>(mut self, boundary_chars: T) -> Self
where
T: ToString,
{
self.boundary_chars = Some(boundary_chars.to_string());
self
}
pub fn boundary_max_scan(mut self, boundary_max_scan: u32) -> Self {
self.boundary_max_scan = Some(boundary_max_scan);
self
}
pub fn encoder(mut self, encoder: Encoder) -> Self {
self.encoder = Some(encoder);
self
}
pub fn force_source(mut self, force_source: bool) -> Self {
self.force_source = Some(force_source);
self
}
pub fn fragment_size(mut self, fragment_size: u32) -> Self {
self.fragment_size = Some(fragment_size);
self
}
pub fn highlight_query<T>(mut self, highlight_query: T) -> Self
where
T: Into<Query>,
{
self.highlight_query = Some(highlight_query.into());
self
}
pub fn no_match_size(mut self, no_match_size: u32) -> Self {
self.no_match_size = Some(no_match_size);
self
}
pub fn number_of_fragments(mut self, number_of_fragments: u32) -> Self {
self.number_of_fragments = Some(number_of_fragments);
self
}
pub fn order(mut self, order: Order) -> Self {
self.order = Some(order);
self
}
pub fn require_field_match(mut self, require_field_match: bool) -> Self {
self.require_field_match = Some(require_field_match);
self
}
pub fn tags<T>(mut self, tags: T) -> Self
where
T: Into<Tags>,
{
self.tags = Some(tags.into());
self
}
};
}
macro_rules! convert_to_highlighter {
($method:tt, $struct:tt) => {
pub fn $method(self) -> $struct {
$struct {
boundary_chars: self.boundary_chars,
boundary_max_scan: self.boundary_max_scan,
encoder: self.encoder,
force_source: self.force_source,
fragment_size: self.fragment_size,
highlight_query: self.highlight_query,
no_match_size: self.no_match_size,
number_of_fragments: self.number_of_fragments,
order: self.order,
pre_tags: self.pre_tags,
post_tags: self.post_tags,
require_field_match: self.require_field_match,
tags: self.tags,
..Default::default()
}
}
};
}
impl DefaultHighlighter {
pub fn new() -> Self {
Default::default()
}
add_highlighter_methods!();
convert_to_highlighter!(fvh, FastVectorHighlighter);
convert_to_highlighter!(plain, PlainHighlighter);
convert_to_highlighter!(unified, UnifiedHighlighter);
}
impl FastVectorHighlighter {
pub fn new() -> Self {
Default::default()
}
add_highlighter_methods!();
pub fn boundary_scanner(mut self, boundary_scanner: FvhBoundaryScanner) -> Self {
self.boundary_scanner = Some(boundary_scanner);
self
}
pub fn fragment_offset(mut self, fragment_offset: u32) -> Self {
self.fragment_offset = Some(fragment_offset);
self
}
pub fn matched_fields<T>(mut self, matched_fields: T) -> Self
where
T: Into<MatchedFields>,
{
self.matched_fields = Some(matched_fields.into());
self
}
pub fn phrase_limit(mut self, phrase_limit: u32) -> Self {
self.phrase_limit = Some(phrase_limit);
self
}
}
impl PlainHighlighter {
pub fn new() -> Self {
Default::default()
}
add_highlighter_methods!();
pub fn fragmenter(mut self, fragmenter: Fragmenter) -> Self {
self.fragmenter = Some(fragmenter);
self
}
}
impl UnifiedHighlighter {
pub fn new() -> Self {
Default::default()
}
add_highlighter_methods!();
pub fn boundary_scanner(mut self, boundary_scanner: UnifiedBoundaryScanner) -> Self {
self.boundary_scanner = Some(boundary_scanner);
self
}
}