github krisk/Fuse v7.4.0

2 hours ago

First stable on the 7.4 line. Aggregates everything from the 7.4.0-beta.17.4.0-beta.8 cycle. See CHANGELOG.md for the per-beta breakdown.

Features

  • FuseWorker — parallel search via Web Workers (9ba192c). New FuseWorker class shards the collection across workers, runs searches in parallel, and preserves the same result ordering as Fuse. See the Web Workers guide.
  • token-search: tokenMatch: 'all' | 'any' option for AND/OR semantics (#827, 9f979d0). Default 'any' preserves existing behavior; 'all' requires every query word to match somewhere in a record (term-centric AND), useful for filter-style queries.
  • token-search: customizable tokenizer with unicode-aware default (#821, 8e55cae). New tokenize?: RegExp | (text: string) => string[] option; the default regex now segments CJK, Cyrillic, Greek, Arabic, etc. out of the box.

Bug Fixes

  • matches: report array-path keys as dotted strings (acd54e8). Previously match.key leaked a raw string[] for keys declared as path arrays (e.g. keys: [['author', 'firstName']]), contradicting the documented FuseResultMatch.key: string type. Now emits the canonical dotted string ('author.firstName'). Behavior change: consumers relying on the array shape need to update.
  • bitap: restrict highlight indices to matched window (#792, 622f105). Closes #505, #611, #691, #793.
  • index: correct doc-index alignment for Fuse<string> with blank docs (0b8e3ca).
  • core: invalidate searcher cache on collection mutation (fcf4228).
  • token-search: renumber inverted index after doc removal (ea9356d).
  • workers: preserve global refIndex across shards (e4217f9), match Fuse ordering and reject non-cloneable options (d571390), reject useTokenSearch in FuseWorker (8c6183d).
  • match: explicitly reject useTokenSearch in Fuse.match (3959d91).
  • correct fieldCount accounting and add reverse lookup in inverted index (54e702c).
  • guard against empty-string crash in fieldNorm (e550ab1); skip consecutive spaces in fieldNorm word counting (5929af6).
  • types: resolve typecheck errors and align KeyStore types (dbc115d).
  • docs: reflect data edits in playground demo (#825, 6eff909).

Performance

  • reuse bit arrays in Bitap search instead of allocating per error level (ec9b446)
  • replace forEach with for loops in search hot paths (1945f49)
  • fast-path Math.pow when exponent is 1 in computeScore (c82de57)
  • pre-allocate records array and use for loops in FuseIndex.create (5800036)
  • replace regex with loop for word counting in fieldNorm (5517a9b)
  • use filter instead of reverse-splice in removeAll / remove (c74823b, 8372b0a)
  • token-search: drop unused postings from inverted index (5ea216f)

Internal

  • refactor: replace extended-search matcher classes with plain functions (f8d61c9)
  • bench: consolidate benchmark/ into bench/ and add npm scripts (3b3a4c6)
  • ci: update Node matrix to 20, 22, 24 (b906906)
  • chore(deps): pin secure versions via npm overrides (3a1b118)

Docs

  • Migrated the site from VuePress to VitePress (663ee53)
  • New articles: "Using Fuse.js with React" (512bc7d), "Fuse.js vs Semantic Search" (5f93b4d)
  • New interactive demos in the fuzzy search article (edit distance, Bitap, threshold, search window)
  • Web Workers documentation and demo
  • Fuse Cloud landing page with waitlist

Behavior changes worth noting

  • FuseResultMatch.key now returns a dotted string for array-path keys (was a raw string[] in violation of the documented type). If you were doing match.key.join('.') to recover the dotted form, drop the .join.

Don't miss a new Fuse release

NewReleases is sending notifications on new releases.