#fuzzy #match #search #text

bin+lib sublime_fuzzy

Fuzzy matching algorithm based on Sublime Text's string search

7 releases (breaking)

Uses old Rust 2015

0.7.0 Dec 19, 2020
0.6.0 Dec 7, 2018
0.5.0 Mar 24, 2018
0.4.1 Aug 17, 2017
0.2.0 Jul 25, 2017

#321 in Text processing

Download history 2248/week @ 2023-02-10 1384/week @ 2023-02-17 1358/week @ 2023-02-24 1576/week @ 2023-03-03 1876/week @ 2023-03-10 2213/week @ 2023-03-17 1694/week @ 2023-03-24 1534/week @ 2023-03-31 1611/week @ 2023-04-07 2767/week @ 2023-04-14 2321/week @ 2023-04-21 2214/week @ 2023-04-28 2239/week @ 2023-05-05 1908/week @ 2023-05-12 1799/week @ 2023-05-19 1777/week @ 2023-05-26

8,262 downloads per month
Used in 18 crates (13 directly)

Custom license

36KB
787 lines

sublime_fuzzy sublime_fuzzy on crates.io

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 in some_thing get a bonus (bonus_word_start)
  • Consecutive matches get an accumulative bonus for every consecutive match (bonus_consecutive)
  • Matches that also match case (T -> T instead of t -> T) in case of a case-insensitive search get a bonus (bonus_match_case)
  • The distance between two matches will be multiplied with the penalty_distance penalty and subtracted from the score

The default scoring is configured 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 result = best_match("something", "some search thing");

assert!(result.is_some());

Match::continuous_matches returns an iter of consecutive matches. Based on those the input string can be formatted.

format_simple provides a simple formatting that wraps matches in tags:

use sublime_fuzzy::{best_match, format_simple};

let target = "some search thing";

let result = best_match("something", target).unwrap();

assert_eq!(
    format_simple(&result, target, "<span>", "</span>"),
    "<span>some</span> search <span>thing</span>"
);

The weighting of the different factors can be adjusted:

use sublime_fuzzy::{FuzzySearch, Scoring};

// Or pick from one of the provided `Scoring::...` methods like `emphasize_word_starts`
let scoring = Scoring {
    bonus_consecutive: 128,
    bonus_word_start: 0,
    ..Scoring::default()
};

let result = FuzzySearch::new("something", "some search thing")
    .case_sensitive()
    .score_with(&scoring)
    .best_match();

assert!(result.is_some())

Note: Any whitespace in the pattern ('something' in the examples above) will be removed.

Documentation

Check out the documentation at docs.rs.

Dependencies

~200KB