Shape · Combine tables

Fuzzy Match

Joins two tables on keys that are similar but not identical, such as customer names with typos. A score column shows how close each match is.

Also known as: Approximate join, record linkage

How it works

Wire the tables into left and right and click Add key under Match keys for each left and right column pair. Algorithm is Jaro-Winkler or Levenshtein, the latter scaled to 0 to 1 by the longer string; with several keys the score is their average. A pair is a match when the score reaches the Threshold, 0.85 by default. Keep is Best match per left row, which keeps the top-scoring right row (ties broken by the right key, so runs are repeatable), or All matches ≥ threshold. The output has both sides' columns plus the Score column, similarity by default; the run stops if an input already has a column of that name. A left row with no match above the threshold is dropped. Every left row is compared with every right row, so cost grows with the product of the two sizes.

Inputs and outputs

Inputs

  • left — Table
  • right — Table

Outputs

  • data — Table

Settings

The Attributes panel of Fuzzy Match, as in the app: the controls work, but nothing runs — there is no data behind it.

The same settings, as the Assistant writes them
{
  keys: [{ leftKey, rightKey }]
  algorithm: "jaro_winkler"|"levenshtein"
  threshold: number (0..1)
  policy: "best"|"all"
  scoreColumn: string
}

similarity join: each left row is compared to every right row (O(n·m)); best = one top match per left row, all = every match ≥ threshold; emits a 0..1 score column

Example

A spreadsheet of customer names has typos and must be matched to the CRM. Key name to customer_name, Jaro-Winkler, threshold 0.9, Best match per left row, then review rows whose similarity is below 0.95 by hand.