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:
-
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. -
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
Example: Comparing a string with a list of strings and retrieving only the best matches
Example: if you have a Vec
of String
s you need to convert it to a list of &str
The crate exposes 5 main functions:
- fuzzy_compare will take 2 strings and return a score representing how similar those strings are.
- fuzzy_search applies fuzzy_compare to a list of strings and returns a list of tuples: (word, score).
- fuzzy_search_sorted is similar to fuzzy_search but orders the output in descending order.
- fuzzy_search_threshold will take an additional
f32
as input and returns only tuples with score greater than the threshold. - fuzzy_search_best_n will take an additional
usize
arguments and returns the firstn
tuples.
Usage
To use this crate, first add this to your Cargo.toml:
[]
= { = "https://gitlab.com/EnricoCh/rust-fuzzy-search"}
Next, add this to your crate:
extern crate rust_fuzzy_search;
use *;
Building
To build the library use cargo build
Testing
To test the library use cargo test
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
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.