https://github.com/ad1992/fuzzify
A tiny lightweight library for Fuzzy Search
https://github.com/ad1992/fuzzify
fuzz fuzzy fuzzy-logic fuzzy-search hacktoberfest lightweight search typescript
Last synced: 11 months ago
JSON representation
A tiny lightweight library for Fuzzy Search
- Host: GitHub
- URL: https://github.com/ad1992/fuzzify
- Owner: ad1992
- License: mit
- Created: 2024-07-18T09:53:08.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-17T17:21:13.000Z (about 1 year ago)
- Last Synced: 2025-03-29T07:07:24.876Z (12 months ago)
- Topics: fuzz, fuzzy, fuzzy-logic, fuzzy-search, hacktoberfest, lightweight, search, typescript
- Language: TypeScript
- Homepage: https://fuzzify.vercel.app
- Size: 73.2 KB
- Stars: 88
- Watchers: 3
- Forks: 5
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# fuzzify
A tiny lightweight library for Fuzzy Search.
## Why
I made this library as a result of learning about [Levenshtein Distance](https://en.wikipedia.org/wiki/Levenshtein_distance) algorithm to calculate the minimum number of single-character edits (insertions, deletions or substitutions) required to transform one word to another by [Vladimir Levenshtein](https://en.wikipedia.org/wiki/Vladimir_Levenshtein).
> [!NOTE]
> Note: The library is at a very early stage so if you want to
> To help improve it, please open an [issue](https://github.com/ad1992/fuzzify/issues).
## Live Demo
You can check the demo [here](https://fuzzify.vercel.app/).
## Installation
with `yarn`
```bash
yarn add fuzzify
```
with `npm`
```bash
npm install fuzzify
```
## Usage
```js
import Fuzzy from "fuzzify";
const countries = [
"Australia",
"France",
"Germany",
"Hungary",
"Iceland",
"India",
"Israel",
"Italy",
"Japan",
"Malawi",
"Malaysia",
"Maldives",
];
const fuzzy = new Fuzzy(countries);
const query = "ala";
const results = fuzzy.search(query);
console.log("RESULTS", results);
```
The `search` API gives approximate matched strings with the passed query in the below format.
| Attributes | Description |
| ---------- | ------------------------------------------------------------------------------------------------------------------ |
| text | The target string against which the query is matched |
| distance | The minimum number of edits (Insertion / Deletion / Substitutions) required to transform the query to target text. |
```js
[
{
text: "Malawi",
distance: 3,
},
{
text: "Malaysia",
distance: 5,
},
{
text: "Australia",
distance: 6,
},
{
text: "Italy",
distance: 3,
},
{
text: "Japan",
distance: 3,
},
{
text: "Iceland",
distance: 5,
},
{
text: "Maldives",
distance: 6,
},
{
text: "Israel",
distance: 5,
},
{
text: "India",
distance: 4,
},
{
text: "France",
distance: 5,
},
{
text: "Germany",
distance: 6,
},
{
text: "Hungary",
distance: 6,
},
];
```
## Options
### `includeMatches`
`includeMatches` - Determines whether the `indices` at which characters match should be returned in the response.
Each `match` element consists of two indices -
1. The index of query string where match is found.
2. The index of target string where a match is found.
Example :point_down:
```js
query = "ala", target string = "Australia"
matches: [
[0, 5],
[1, 6],
[2, 8],
],
```
In the above example :point_down: matches are found
1. character `a` at `0th` index in `ala` matches with characater `a` at `5th` index in `Australia`
2. character `l` at `1st` index in `ala` matches with characater `a` at `6th` index in `Australia`
3. character `a` at `2nd` index in `ala` matches with characater `a` at `8th` index in `Australia`
The complete response would be :point_down:
```js
[
{
text: "Malawi",
distance: 3,
matches: [
[0, 1],
[1, 2],
[2, 3],
],
},
{
text: "Malaysia",
distance: 5,
matches: [
[0, 1],
[1, 2],
[2, 7],
],
},
{
text: "Australia",
distance: 6,
matches: [
[0, 5],
[1, 6],
[2, 8],
],
},
{
text: "Italy",
distance: 3,
matches: [
[0, 2],
[1, 3],
],
},
{
text: "Japan",
distance: 3,
matches: [
[0, 1],
[2, 3],
],
},
{
text: "Iceland",
distance: 5,
matches: [
[1, 3],
[2, 4],
],
},
{
text: "Maldives",
distance: 6,
matches: [
[0, 1],
[1, 2],
],
},
{
text: "Israel",
distance: 5,
matches: [
[0, 3],
[1, 5],
],
},
{
text: "India",
distance: 4,
matches: [[2, 4]],
},
{
text: "France",
distance: 5,
matches: [[2, 2]],
},
{
text: "Germany",
distance: 6,
matches: [[2, 4]],
},
{
text: "Hungary",
distance: 6,
matches: [[2, 4]],
},
];
```
### `includeScore`
Determines whether a score should be added in the result. A score of `1` means an exact match, however a score of `0` means
no match and those options are removed from the result.
If you want to get all the options in the result, please open an [issue](https://github.com/ad1992/fuzzy/issues) and let's discuss.
### `caseSensitive`
Determines whether the query should be case-sensitive or not.
By default, this option is `false`.
## Set up
Install packages:
```
yarn
```
Start development playground:
```
yarn start
```
Build command:
```
yarn build
```
## Contributing
Please open an [issue](https://github.com/ad1992/fuzzify/issues) so we can start discussing. Any help to improve the library is most welcome :).