@@ -13,6 +13,7 @@ use crate::{
13
13
} ,
14
14
options:: profile:: Profile ,
15
15
} ;
16
+ use aho_corasick:: AhoCorasickBuilder ;
16
17
use chrono:: { TimeZone , Utc } ;
17
18
use compact_str:: CompactString ;
18
19
use csv:: { QuoteStyle , Writer , WriterBuilder } ;
@@ -122,6 +123,24 @@ impl EventSearch {
122
123
} )
123
124
}
124
125
126
+ fn get_default_details_mapping_table (
127
+ & self ,
128
+ stored_static : & StoredStatic ,
129
+ ) -> HashMap < CompactString , CompactString > {
130
+ let mut default_details_abbr: HashMap < CompactString , CompactString > = HashMap :: new ( ) ;
131
+ for detail_values in stored_static. default_details . values ( ) {
132
+ detail_values. split ( " ¦ " ) . for_each ( |x| {
133
+ let abbr_k_v = x. split ( ": " ) . collect_vec ( ) ;
134
+ if abbr_k_v. len ( ) == 2 {
135
+ let abbr: CompactString = abbr_k_v[ 0 ] . into ( ) ;
136
+ let full: CompactString = abbr_k_v[ 1 ] . replace ( "%" , "" ) . trim ( ) . into ( ) ;
137
+ default_details_abbr. insert ( full, abbr) ;
138
+ }
139
+ } ) ;
140
+ }
141
+ default_details_abbr
142
+ }
143
+
125
144
// check if a record contains the keywords specified in a search command option or not.
126
145
fn search_keyword (
127
146
& mut self ,
@@ -146,6 +165,15 @@ impl EventSearch {
146
165
Some ( Action :: Search ( opt) ) => ( opt. ignore_case , opt. and_logic ) ,
147
166
_ => ( false , false ) ,
148
167
} ;
168
+ let default_details_abbr = self . get_default_details_mapping_table ( stored_static) ;
169
+ let all_field_info_abbr = AhoCorasickBuilder :: new ( )
170
+ . ascii_case_insensitive ( true )
171
+ . build ( default_details_abbr. keys ( ) . map ( |x| x. as_str ( ) ) )
172
+ . unwrap ( ) ;
173
+ let all_field_info_abbr_value = default_details_abbr
174
+ . values ( )
175
+ . map ( |x| x. as_str ( ) )
176
+ . collect_vec ( ) ;
149
177
for record in records. iter ( ) {
150
178
// filtering
151
179
if !self . filter_record ( record, & filter_rule, & stored_static. eventkey_alias ) {
@@ -192,11 +220,16 @@ impl EventSearch {
192
220
& stored_static. eventkey_alias ,
193
221
stored_static. output_option . as_ref ( ) . unwrap ( ) ,
194
222
) ;
195
- let allfieldinfo_newline_splited = ALLFIELDINFO_SPECIAL_CHARS
196
- . replace_all ( & allfieldinfo, & [ "🦅" , "🦅" , "🦅" ] )
197
- . split ( '🦅' )
198
- . filter ( |x| !x. is_empty ( ) )
199
- . join ( " " ) ;
223
+ let allfieldinfo_newline_splited = all_field_info_abbr. replace_all (
224
+ ALLFIELDINFO_SPECIAL_CHARS
225
+ . replace_all ( & allfieldinfo, & [ "🦅" , "🦅" , "🦅" ] )
226
+ . split ( '🦅' )
227
+ . filter ( |x| !x. is_empty ( ) )
228
+ . join ( " " )
229
+ . as_str ( ) ,
230
+ & all_field_info_abbr_value,
231
+ ) ;
232
+
200
233
if search_option. sort_events {
201
234
// we cannot sort all the records unless we get all the records; so we just collect the hit record at this code and we'll sort them later.
202
235
self . search_result . insert ( (
@@ -247,6 +280,16 @@ impl EventSearch {
247
280
return ;
248
281
}
249
282
283
+ let default_details_abbr = self . get_default_details_mapping_table ( stored_static) ;
284
+ let all_field_info_abbr = AhoCorasickBuilder :: new ( )
285
+ . ascii_case_insensitive ( true )
286
+ . build ( default_details_abbr. keys ( ) . map ( |x| x. as_str ( ) ) )
287
+ . unwrap ( ) ;
288
+ let all_field_info_abbr_value = default_details_abbr
289
+ . values ( )
290
+ . map ( |x| x. as_str ( ) )
291
+ . collect_vec ( ) ;
292
+
250
293
let filter_rule = create_filter_rule ( & search_option. filter ) ;
251
294
let mut wtr = ResultWriter :: new ( search_option) ;
252
295
for record in records. iter ( ) {
@@ -268,11 +311,15 @@ impl EventSearch {
268
311
& stored_static. eventkey_alias ,
269
312
stored_static. output_option . as_ref ( ) . unwrap ( ) ,
270
313
) ;
271
- let allfieldinfo_newline_splited = ALLFIELDINFO_SPECIAL_CHARS
272
- . replace_all ( & allfieldinfo, & [ "🦅" , "🦅" , "🦅" ] )
273
- . split ( '🦅' )
274
- . filter ( |x| !x. is_empty ( ) )
275
- . join ( " " ) ;
314
+ let allfieldinfo_newline_splited = all_field_info_abbr. replace_all (
315
+ ALLFIELDINFO_SPECIAL_CHARS
316
+ . replace_all ( & allfieldinfo, & [ "🦅" , "🦅" , "🦅" ] )
317
+ . split ( '🦅' )
318
+ . filter ( |x| !x. is_empty ( ) )
319
+ . join ( " " )
320
+ . as_str ( ) ,
321
+ & all_field_info_abbr_value,
322
+ ) ;
276
323
if search_option. sort_events {
277
324
// we cannot sort all the records unless we get all the records; so we just collect the hit record at this code and we'll sort them later.
278
325
self . search_result . insert ( (
0 commit comments