quickmatch 0.4.0

Lightning-fast fuzzy string matching with hybrid word and trigram indexing
Documentation

quickmatch

Fast fuzzy string matching for Rust and JavaScript.

Built for autocomplete, command palettes, and search-as-you-type interfaces.

Crates.io npm Documentation

Install

# rust
cargo add quickmatch

# js
npm install quickmatch-js

Usage

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

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