#fuzzy-search #compare #compare-strings

bin+lib rust-fuzzy-search

Fuzzy Search with trigrams implemented in Rust

2 releases

0.1.1 Jul 14, 2021
0.1.0 Jul 14, 2021

#21 in #fuzzy-search

Download history 312/week @ 2023-11-19 294/week @ 2023-11-26 235/week @ 2023-12-03 419/week @ 2023-12-10 263/week @ 2023-12-17 230/week @ 2023-12-24 308/week @ 2023-12-31 321/week @ 2024-01-07 356/week @ 2024-01-14 324/week @ 2024-01-21 263/week @ 2024-01-28 296/week @ 2024-02-04 301/week @ 2024-02-11 391/week @ 2024-02-18 328/week @ 2024-02-25 311/week @ 2024-03-03

1,356 downloads per month
Used in 10 crates

MIT/Apache

1MB
234 lines

Rust Fuzzy Search | Documentation

Fuzzy search with trigrams implemented in Rust

This crate implements Fuzzy Searching with trigrams

Fuzzy searching allows to compare strings by similarity rather than by equality:
Similar strings will get a high score (close to 1.0f32) while dissimilar strings will get a lower score (closer to 0.0f32).

Fuzzy searching tolerates changes in word order:
ex. "John Dep" and "Dep John" will get a high score.

The Algorithm used is taken from : https://dev.to/kaleman15/fuzzy-searching-with-postgresql-97o

Basic idea:

  1. From both strings extracts all groups of 3 adjacent letters.
    ("House" becomes [' H', ' Ho', 'Hou', 'ous', 'use', 'se ']).
    Note the 2 spaces added to the head of the string and the one on the tail, used to make the algorithm work on zero length words.

  2. Then counts the number of trigrams of the first words that are also present on the second word and divide by the number of trigrams of the first word.

Example: Comparing 2 strings

fn test () {
   use rust_fuzzy_search::fuzzy_compare;
   let score : f32 = fuzzy_compare("kolbasobulko", "kolbasobulko");
   println!("score = {:?}", score);
}

Example: Comparing a string with a list of strings and retrieving only the best matches

 fn test() {
     use rust_fuzzy_search::fuzzy_search_best_n;
     let s = "bulko";
     let list : Vec<&str> = vec![
         "kolbasobulko",
         "sandviĉo",
         "ŝatas",
         "domo",
         "emuo",
         "fabo",
         "fazano"
     ];
     let n : usize = 3;
     let res : Vec<(&str, f32)> = fuzzy_search_best_n(s,&list, n);
     for (_word, score) in res {
         println!("{:?}",score)
     }
 }

Example: if you have a Vec of Strings you need to convert it to a list of &str

fn works_with_strings() {
    use rust_fuzzy_search::fuzzy_search;
    let s = String::from("varma");
    let list: Vec<String> = vec![String::from("varma vetero"), String::from("varma ĉokolado")];
    fuzzy_search(&s, &list.iter().map(String::as_ref).collect::<Vec<&str>>());
}

The crate exposes 5 main functions:

Usage

To use this crate, first add this to your Cargo.toml:

[dependencies]
rust-fuzzy-search = { git = "https://gitlab.com/EnricoCh/rust-fuzzy-search"}

Next, add this to your crate:

extern crate rust_fuzzy_search;

use rust_fuzzy_search::*;

fn main() {
// ...
}

Building

To build the library use cargo build

Testing

To test the library use cargo test

License

Licensed under either of

MIT License Apache 2.0 License

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

No runtime deps