mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-08-12 10:13:06 -07:00
96 lines
2.6 KiB
Markdown
96 lines
2.6 KiB
Markdown
# quickmatch
|
|
|
|
Fast fuzzy string matching for Rust and JavaScript.
|
|
|
|
Built for autocomplete, command palettes, and search-as-you-type interfaces.
|
|
|
|
[](https://crates.io/crates/quickmatch)
|
|
[](https://www.npmjs.com/package/quickmatch-js)
|
|
[](https://docs.rs/quickmatch)
|
|
|
|
## Install
|
|
|
|
```bash
|
|
# rust
|
|
cargo add quickmatch
|
|
|
|
# js
|
|
npm install quickmatch-js
|
|
```
|
|
|
|
## Usage
|
|
|
|
**Rust**
|
|
|
|
```rust
|
|
use quickmatch::{QuickMatch, QuickMatchConfig};
|
|
|
|
let items = vec!["file_name", "file_size", "created_at", "updated_at"];
|
|
let qm = QuickMatch::new(&items);
|
|
|
|
qm.matches("file name"); // ["file_name", "file_size"]
|
|
qm.matches("filename"); // ["file_name", "file_size"] (compound match)
|
|
qm.matches("filenme"); // ["file_name", "file_size"] (trigram fuzzy)
|
|
|
|
// Custom config
|
|
let config = QuickMatchConfig::new()
|
|
.with_limit(5)
|
|
.with_trigram_budget(10)
|
|
.with_separators(&['_', '-', ' ']);
|
|
let qm = QuickMatch::new_with(&items, config);
|
|
```
|
|
|
|
**JavaScript**
|
|
|
|
```js
|
|
import { QuickMatch, QuickMatchConfig } from "quickmatch-js";
|
|
|
|
const items = ["file_name", "file_size", "created_at", "updated_at"];
|
|
const qm = new QuickMatch(items);
|
|
|
|
qm.matches("file name"); // ["file_name", "file_size"]
|
|
qm.matches("filename"); // ["file_name", "file_size"] (compound match)
|
|
qm.matches("filenme"); // ["file_name", "file_size"] (trigram fuzzy)
|
|
|
|
// Custom config
|
|
const config = new QuickMatchConfig()
|
|
.withLimit(5)
|
|
.withTrigramBudget(10)
|
|
.withSeparators("_- ");
|
|
const qm2 = new QuickMatch(items, config);
|
|
```
|
|
|
|
## How it works
|
|
|
|
Queries go through three matching stages:
|
|
|
|
1. **Word match** — query is split by separators and looked up in a word index
|
|
2. **Compound match** — adjacent words are indexed as compounds, so `hashrate` finds `hash_rate`
|
|
3. **Trigram fallback** — unknown words are matched via character trigrams for fuzzy/typo tolerance
|
|
|
|
Results are ranked by prefix score (exact > prefix > unordered), then by trigram score, then by length.
|
|
|
|
## Config
|
|
|
|
All options are documented in the `QuickMatchConfig` source. Builder methods:
|
|
|
|
| Rust | JS | Default |
|
|
|------|-----|---------|
|
|
| `with_limit(n)` | `withLimit(n)` | 100 |
|
|
| `with_trigram_budget(n)` | `withTrigramBudget(n)` | 6 |
|
|
| `with_min_score(n)` | `withMinScore(n)` | 2 |
|
|
| `with_separators(&[..])` | `withSeparators(s)` | `_- :/` |
|
|
|
|
## Performance
|
|
|
|
Benchmarked against ~5,000 metric names, 83 queries, averaged over 10K iterations:
|
|
|
|
| | Avg/query | Build time |
|
|
|---|-----------|------------|
|
|
| **Rust** | ~26 us | ~40 ms |
|
|
| **JS** | ~29 us | ~30 ms |
|
|
|
|
## License
|
|
|
|
MIT
|