fix: Make distillery fuzzy matching stricter

- Threshold: 0.25 (was 0.4)
- Score check: 0.3 (was 0.5)
- minMatchCharLength: 4 (was 3)

Prevents false positives like 'Kilkeran' → 'Glenglassaugh'
This commit is contained in:
2025-12-26 22:30:59 +01:00
parent 883b2b61b4
commit e3d61af40a

View File

@@ -24,10 +24,10 @@ const STOPWORDS = [
// Initialize Fuse.js with distilleries // Initialize Fuse.js with distilleries
const fuse = new Fuse<Distillery>(distilleries as Distillery[], { const fuse = new Fuse<Distillery>(distilleries as Distillery[], {
keys: ['name'], keys: ['name'],
threshold: 0.4, // Fuzzy tolerance (0 = exact, 1 = match anything) threshold: 0.25, // Stricter fuzzy tolerance (was 0.4)
includeScore: true, includeScore: true,
ignoreLocation: true, ignoreLocation: true,
minMatchCharLength: 3, minMatchCharLength: 4,
}); });
/** /**
@@ -80,10 +80,30 @@ export function normalizeDistillery(rawName: string): {
}; };
} }
// Fuzzy match with Fuse.js // Try partial/contains match for cases like "Kilkeran" in name "Kilkerran"
// or input contains distillery name
const partialMatch = (distilleries as Distillery[]).find(d => {
const dLower = d.name.toLowerCase();
const pLower = preprocessed.toLowerCase();
// Check if one contains the other (with at least 5 chars overlap)
return (dLower.includes(pLower) && pLower.length >= 5) ||
(pLower.includes(dLower) && dLower.length >= 5);
});
if (partialMatch) {
console.log(`[DistilleryMatcher] Partial match: "${rawName}" → "${partialMatch.name}"`);
return {
name: partialMatch.name,
region: partialMatch.region,
matched: true,
score: 0.1
};
}
// Fuzzy match with Fuse.js (stricter threshold)
const results = fuse.search(preprocessed); const results = fuse.search(preprocessed);
if (results.length > 0 && results[0].score !== undefined && results[0].score < 0.5) { if (results.length > 0 && results[0].score !== undefined && results[0].score < 0.3) {
const match = results[0].item; const match = results[0].item;
console.log(`[DistilleryMatcher] Fuzzy match: "${rawName}" → "${match.name}" (score: ${results[0].score?.toFixed(3)})`); console.log(`[DistilleryMatcher] Fuzzy match: "${rawName}" → "${match.name}" (score: ${results[0].score?.toFixed(3)})`);
return { return {