@@ -222,11 +222,20 @@ where
222222 let len = max ( token. len ( ) , pattern_token. len ( ) ) as f64 ;
223223 // calculate k (based on the threshold) to bound the Levenshtein distance
224224 let k = ( ( 1.0 - self . option . threshold ) * len) . ceil ( ) as u32 ;
225- // levenshtein_simd_k only works on ASCII byte slices, so the token strings
226- // are directly treated as byte slices
227- match levenshtein_simd_k ( token. as_bytes ( ) , pattern_token. as_bytes ( ) , k) {
228- Some ( dist) => 1.0 - if len == 0.0 { 0.0 } else { ( dist as f64 ) / len } ,
229- None => f64:: MIN ,
225+
226+ // cheap prefilter: if length difference already exceeds k,
227+ // levenshtein_simd_k would return None, so skip calling it.
228+ let tlen = token. len ( ) as i32 ;
229+ let plen = pattern_token. len ( ) as i32 ;
230+ if ( ( tlen - plen) . abs ( ) as u32 ) > k {
231+ f64:: MIN
232+ } else {
233+ // levenshtein_simd_k only works on ASCII byte slices, so the token strings
234+ // are directly treated as byte slices
235+ match levenshtein_simd_k ( token. as_bytes ( ) , pattern_token. as_bytes ( ) , k) {
236+ Some ( dist) => 1.0 - if len == 0.0 { 0.0 } else { ( dist as f64 ) / len } ,
237+ None => f64:: MIN ,
238+ }
230239 }
231240 } else {
232241 jaro_winkler ( token, & pattern_token)
@@ -276,10 +285,13 @@ where
276285 pub fn remove ( & mut self , id : & Id ) {
277286 if let Some ( id_num) = self . ids_map . get ( id) {
278287 for token in & self . forward_map [ id_num] {
279- self . reverse_map
280- . get_mut ( token)
281- . unwrap ( )
282- . retain ( |i| i != id_num) ;
288+ if let Some ( vec) = self . reverse_map . get_mut ( token) {
289+ vec. retain ( |i| i != id_num) ;
290+ if vec. is_empty ( ) {
291+ // prune empty token entry to keep the index small
292+ self . reverse_map . remove ( token) ;
293+ }
294+ }
283295 }
284296 self . forward_map . remove ( id_num) ;
285297 self . reverse_ids_map . remove ( id_num) ;
@@ -328,6 +340,8 @@ where
328340
329341 tokens. retain ( |token| !token. is_empty ( ) ) ;
330342
343+
344+
331345 tokens
332346 }
333347}
0 commit comments