Crate sublime_fuzzy
source ·Expand description
Fuzzy matching algorithm based on Sublime Text’s string search. Iterates through characters of a search string and calculates a score.
The score is based on several factors:
- Word starts like the
t
insome_thing
get a bonus (bonus_word_start
) - Consecutive matches get an accumulative bonus for every consecutive match (
bonus_consecutive
) - Matches with higher coverage (targets
some_release
(lower) versusa_release
(higher) with patternrelease
) will get a bonus multiplied by the coverage percentage (bonus_coverage
) - The distance between two matches will be multiplied with the
penalty_distance
penalty and subtracted from the score
The default bonus/penalty values are set to give a lot of weight to word starts. So a pattern scc
will match
SoccerCartoonController, not SoccerCartoonController.
Match Examples
With default weighting.
Pattern | Target string | Result |
---|---|---|
scc | SoccerCartoonController | SoccerCartoonController |
something | some search thing | some search thing |
Usage
Basic usage:
use sublime_fuzzy::best_match;
let s = "some search thing";
let search = "something";
let result = best_match(search, s).unwrap();
println!("score: {:?}", result.score());
Match.continuous_matches()
returns a list of consecutive matches
((start_index, length)
). Based on those the input string can be formatted.
sublime_fuzzy
provides a simple formatting function that wraps matches in
tags:
use sublime_fuzzy::{best_match, format_simple};
let s = "some search thing";
let search = "something";
let result = best_match(search, s).unwrap();
assert_eq!(
format_simple(&result, s, "<span>", "</span>"),
"<span>some</span> search <span>thing</span>"
);
The weighting of the different factors can be adjusted:
use sublime_fuzzy::{FuzzySearch, ScoreConfig};
let case_insensitive = true;
let mut search = FuzzySearch::new("something", "some search thing", case_insensitive);
let config = ScoreConfig {
bonus_consecutive: 12,
bonus_word_start: 64,
bonus_coverage: 64,
penalty_distance: 4,
};
search.set_score_config(config);
println!("result: {:?}", search.best_match());
Note: Any whitespace in the pattern ('something'
in the examples above) will be removed.
Structs
Container for search configuration.
Allows for adjusting the factors used to calculate the match score.
Contains the calculated match score and all matches for a single result.
A container holding the boni and penalties used to score a match.
Functions
Returns the best match for
pattern
in target
.Formats a
Match
by appending before
before any matches and after
after any matches.