elasticsearch_dsl/search/highlight/
boundary_scanner.rs

1use serde::ser::{Serialize, SerializeStruct, Serializer};
2
3/// Specifies how to break the highlighted fragments. Defaults to
4/// [`sentence`](UnifiedBoundaryScanner::Sentence).
5#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
6pub enum UnifiedBoundaryScanner {
7    /// Break highlighted fragments at the next sentence boundary, as determined by Java’s
8    /// [BreakIterator](https://docs.oracle.com/javase/8/docs/api/java/text/BreakIterator.html).
9    /// You can specify the locale to use with `boundary_scanner_locale`.
10    ///
11    /// > **Warning**<br/>
12    /// > The `sentence` scanner splits sentences bigger than `fragment_size` at the first word
13    /// > boundary next to `fragment_size`. You can set `fragment_size` to 0 to never split any
14    /// > sentence.
15    Sentence(Option<String>),
16
17    /// Break highlighted fragments at the next word boundary, as determined by Java’s
18    /// [BreakIterator](https://docs.oracle.com/javase/8/docs/api/java/text/BreakIterator.html).
19    /// You can specify the locale to use with `boundary_scanner_locale`.
20    Word(Option<String>),
21}
22
23/// Specifies how to break the highlighted fragments. Defaults to
24/// [`sentence`](FvhBoundaryScanner::Chars).
25#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
26pub enum FvhBoundaryScanner {
27    /// Use the characters specified by `boundary_chars` as highlighting boundaries. The
28    /// `boundary_max_scan` setting controls how far to scan for boundary characters.
29    Chars,
30
31    /// Break highlighted fragments at the next sentence boundary, as determined by Java’s
32    /// [BreakIterator](https://docs.oracle.com/javase/8/docs/api/java/text/BreakIterator.html).
33    /// You can specify the locale to use with `boundary_scanner_locale`.
34    Sentence(Option<String>),
35
36    /// Break highlighted fragments at the next word boundary, as determined by Java’s
37    /// [BreakIterator](https://docs.oracle.com/javase/8/docs/api/java/text/BreakIterator.html).
38    /// You can specify the locale to use with `boundary_scanner_locale`.
39    Word(Option<String>),
40}
41
42impl Serialize for UnifiedBoundaryScanner {
43    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        match self {
48            Self::Sentence(locale) => match locale {
49                Some(locale) => {
50                    let mut map =
51                        serializer.serialize_struct("UnifiedBoundaryScannerSentence2", 2)?;
52                    map.serialize_field("boundary_scanner", "sentence")?;
53                    map.serialize_field("boundary_scanner_locale", locale)?;
54                    map.end()
55                }
56                None => {
57                    let mut map =
58                        serializer.serialize_struct("UnifiedBoundaryScannerSentence1", 1)?;
59                    map.serialize_field("boundary_scanner", "sentence")?;
60                    map.end()
61                }
62            },
63            Self::Word(locale) => match locale {
64                Some(locale) => {
65                    let mut map = serializer.serialize_struct("UnifiedBoundaryScannerWord2", 2)?;
66                    map.serialize_field("boundary_scanner", "word")?;
67                    map.serialize_field("boundary_scanner_locale", locale)?;
68                    map.end()
69                }
70                None => {
71                    let mut map = serializer.serialize_struct("UnifiedBoundaryScannerWord1", 1)?;
72                    map.serialize_field("boundary_scanner", "word")?;
73                    map.end()
74                }
75            },
76        }
77    }
78}
79
80impl Serialize for FvhBoundaryScanner {
81    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
82    where
83        S: Serializer,
84    {
85        match self {
86            Self::Chars => {
87                let mut map = serializer.serialize_struct("FvhBoundaryScannerChars", 1)?;
88                map.serialize_field("boundary_scanner", "chars")?;
89                map.end()
90            }
91            Self::Sentence(locale) => match locale {
92                Some(locale) => {
93                    let mut map = serializer.serialize_struct("FvhBoundaryScannerSentence2", 2)?;
94                    map.serialize_field("boundary_scanner", "sentence")?;
95                    map.serialize_field("boundary_scanner_locale", locale)?;
96                    map.end()
97                }
98                None => {
99                    let mut map = serializer.serialize_struct("FvhBoundaryScannerSentence1", 1)?;
100                    map.serialize_field("boundary_scanner", "sentence")?;
101                    map.end()
102                }
103            },
104            Self::Word(locale) => match locale {
105                Some(locale) => {
106                    let mut map = serializer.serialize_struct("FvhBoundaryScannerWord2", 2)?;
107                    map.serialize_field("boundary_scanner", "word")?;
108                    map.serialize_field("boundary_scanner_locale", locale)?;
109                    map.end()
110                }
111                None => {
112                    let mut map = serializer.serialize_struct("FvhBoundaryScannerWord1", 1)?;
113                    map.serialize_field("boundary_scanner", "word")?;
114                    map.end()
115                }
116            },
117        }
118    }
119}
120
121#[cfg(test)]
122mod tests {
123    use super::*;
124    use crate::util::*;
125
126    #[test]
127    fn serialization() {
128        assert_serialize(
129            UnifiedBoundaryScanner::Sentence(None),
130            json!({ "boundary_scanner": "sentence" }),
131        );
132
133        assert_serialize(
134            UnifiedBoundaryScanner::Sentence(Some("en-US".into())),
135            json!({ "boundary_scanner": "sentence", "boundary_scanner_locale": "en-US" }),
136        );
137
138        assert_serialize(
139            UnifiedBoundaryScanner::Word(None),
140            json!({ "boundary_scanner": "word" }),
141        );
142
143        assert_serialize(
144            UnifiedBoundaryScanner::Word(Some("en-US".into())),
145            json!({ "boundary_scanner": "word", "boundary_scanner_locale": "en-US" }),
146        );
147
148        assert_serialize(
149            FvhBoundaryScanner::Chars,
150            json!({ "boundary_scanner": "chars" }),
151        );
152
153        assert_serialize(
154            FvhBoundaryScanner::Sentence(None),
155            json!({ "boundary_scanner": "sentence" }),
156        );
157
158        assert_serialize(
159            FvhBoundaryScanner::Sentence(Some("en-US".into())),
160            json!({ "boundary_scanner": "sentence", "boundary_scanner_locale": "en-US" }),
161        );
162
163        assert_serialize(
164            FvhBoundaryScanner::Word(None),
165            json!({ "boundary_scanner": "word" }),
166        );
167
168        assert_serialize(
169            FvhBoundaryScanner::Word(Some("en-US".into())),
170            json!({ "boundary_scanner": "word", "boundary_scanner_locale": "en-US" }),
171        );
172    }
173}