fuzzyScore function
Compound fuzzy score in 0..1, higher = better match.
Blends:
- Token-set overlap (symmetric Jaccard, weight 0.6). Reaches 1.0 when
queryandcandidatetokenize 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);
}