fuzzyScore function

double fuzzyScore(
  1. String query,
  2. String candidate
)

Compound fuzzy score in 0..1, higher = better match.

Blends:

  • Token-set overlap (symmetric Jaccard, weight 0.6). Reaches 1.0 when query and candidate tokenize to the same set.
  • Diacritic-folded, case-insensitive substring containment (weight 0.4).

Empty inputs short-circuit to 0.0. Identical inputs reach exactly 1.0.

Implementation

double fuzzyScore(String query, String candidate) {
  if (query.isEmpty || candidate.isEmpty) return 0.0;
  final qSet = tokenize(query).toSet();
  final cSet = tokenize(candidate).toSet();
  final tokenScore = jaccardSimilarity(qSet, cSet);
  final foldedQuery = foldDiacritics(query).toLowerCase();
  final foldedCand = foldDiacritics(candidate).toLowerCase();
  final substr = foldedCand.contains(foldedQuery) ? 1.0 : 0.0;
  return (0.6 * tokenScore + 0.4 * substr).clamp(0.0, 1.0);
}