Navigation
FrameworkMay 24, 2026
12 min read

A Practical Guide to Entity Resolution

A general guide to matching messy records into governed entities, with blocking, scoring, selective review, clustering, survivorship, and evidence-first reference tables.

Entity resolution starts when a system has more records than real things.

A customer appears twice because one source has "Acme Inc." and another has "ACME Incorporated." A supplier changes address. A patient has two spellings of the same name. A product feed carries the same item with different titles, units, and manufacturer codes. A company database has branches, subsidiaries, former names, and legal entities mixed together.

The job is to decide which records refer to the same thing and to keep a usable representation of that thing without throwing away the evidence that produced it. That second part is where many projects become fragile. A merged row may be convenient for a dashboard, but the system still needs to know which source records were linked, which fields won, which model or rule made the decision, and which cases were uncertain.

This guide treats entity resolution as a general operating pattern. It can apply to customers, products, suppliers, companies, locations, patients, assets, files, tickets, or any other domain where duplicate or overlapping records accumulate.

The basic vocabulary

An entity is the real thing you care about. A source record is one system's version of that thing. A candidate pair is a possible match between two records. A cluster is a set of records that currently appear to describe the same entity. A canonical entity is the version of that entity that the rest of the business reads.

Those terms should stay separate. If the canonical table is treated as the only truth, it becomes hard to explain mistakes or rerun the system after rules change. If the evidence layer is preserved, the canonical table can be rebuilt when better matching logic, new data, or a human review changes the answer.

Diagram showing an entity resolution pipeline from source records through normalization, blocking, scoring, clustering, and a canonical view, with selective review and an append-only evidence layer.

The reusable pipeline

Every serious entity resolution system has roughly the same shape, even when the domain changes.

StageWhat it doesWhat to keep
IngestBring source records into one place without losing their originsource system, source primary key, raw payload, ingest time
NormalizeMake comparable fields easier to comparenormalized values, rule version, parsing failures
BlockGenerate a smaller set of plausible candidate matchescandidate edges, blocker name, blocker version
ScoreEstimate whether candidates refer to the same entityscore, label, confidence, model version, feature evidence
ReviewSend ambiguous cases to a human or LLMdecision, reviewer or model, explanation, cost, timestamp
ClusterTurn pair evidence into entity groupscluster version, membership, conflict decisions
PublishMaterialize the current canonical viewwinning attributes, survivorship rules, source lineage

The table is intentionally plain because this is the part that transfers across industries. The exact fields change. The sequence usually does not.

Start by defining the entity

Before choosing a model, decide what counts as one thing.

For people, the question might be whether two rows refer to the same individual, the same household, or the same customer account. For businesses, the question might be whether branches roll into a parent company, whether legal entities stay separate, or whether former names should merge. For products, the question might be whether pack size, region, or color variant creates a separate entity.

This is not a semantic detail. It changes the labels, the blockers, the evaluation set, the review policy, and the final reference table. A system that merges too broadly may destroy useful distinctions. A system that merges too narrowly may leave every downstream analysis full of duplicates.

Write the boundary down in ordinary language before building anything.

Keep source records immutable

The raw input should be append-only. If a CRM row, product feed, claim record, or supplier file arrives, store it with its source system, source primary key, raw payload, normalized payload, and ingest timestamp.

Do not overwrite the source record to make it look cleaner. Cleaned values belong beside the raw value, with the rule or parser version that produced them. That gives you a way to compare today's normalization with next month's normalization and to explain why a match changed.

In practice, this means the first table is not a golden record table. It is a source record table.

Normalize before matching

Normalization removes surface noise before the expensive part starts.

Names need case handling, punctuation cleanup, token ordering, nicknames, legal suffixes, transliteration, and sometimes language-specific handling. Addresses need postal normalization and geocoding when available. Products need unit conversion, brand cleanup, model-number parsing, pack-size handling, and category hints. Dates, phone numbers, emails, tax IDs, and URLs need their own validators.

This work is not glamorous, but it saves the matcher from wasting effort on differences that should never have reached the model. It also gives human reviewers a cleaner view of the evidence.

Keep failed normalization visible. A parser failure is often a signal that a source system changed its schema or that a new kind of record entered the pipeline.

Blocking is the part that makes the system possible

Without blocking, a million records create roughly five hundred billion possible pairs. No LLM, cross-encoder, or probabilistic matcher should be asked to work at that scale directly.

Blocking creates candidate pairs that are plausible enough to score. Good systems usually use several blockers and union the results.

  • exact or near-exact identifiers when trusted IDs exist
  • normalized name plus postal code for people or companies
  • phonetic keys for names
  • manufacturer plus model number for products
  • geospatial cells for locations
  • embedding nearest neighbors for semantic recall
  • domain-specific buckets such as country, category, account, or registry

The goal of blocking is high recall with manageable candidate volume. It is acceptable for blockers to generate false positives because the matcher can reject them later. It is more dangerous for blockers to miss true matches, because missed candidates never reach the scoring stage.

Track which blocker produced each candidate. That provenance is useful when a source starts generating bad candidates or when one blocker is carrying most of the recall.

Score cheaply before using expensive reasoning

After blocking, score candidate pairs with the cheapest reliable method first. Depending on the data, that might be a probabilistic linkage model, a gradient-boosted model, a small transformer, a cross-encoder, or a rule-based scorer with calibrated weights.

The scorer should produce more than a label. It should produce a score or confidence, the features that mattered, and enough metadata to reproduce the decision later. If two candidates are close, or if a pair sits near the threshold, route it to a stronger method or a reviewer.

This is where LLMs can help, but they should enter deliberately. The recent literature points in the same direction: LLMs are strongest when used for ambiguous cases, candidate selection, explanations, or cluster-level decisions. They are usually a poor first-pass blocker on large data.

Where LLMs fit

There are several useful LLM roles in entity resolution.

RoleUse it whenMain risk
Pairwise classifierA small candidate set needs semantic judgmentignores global consistency
Listwise selectorOne anchor has several plausible candidatesposition bias and context sensitivity
Selective verifierA cheap model is uncertaindepends on upstream candidate quality
Explanation generatorYou want training signal for a smaller modelexplanations can sound plausible while being wrong
Cluster helperThe task is true deduplication across setsset construction and ordering affect quality

The pattern to avoid is sending every possible pair to a large model. It is expensive, difficult to audit, and often worse than a hybrid pipeline that spends model calls only where uncertainty is high.

LLM outputs should go into the evidence layer. Store the model name, prompt version, input fields, answer, confidence, explanation, latency, and token cost. That makes the LLM one source of evidence, not an invisible authority inside the golden record.

Resolve clusters, not just pairs

Pairwise scores are intermediate evidence. The final question is usually cluster membership: which records belong to the same entity?

This step depends on the problem.

  • Clean-clean linkage often needs one-to-one assignment because one record from source A should match at most one record from source B.
  • Dirty-dirty deduplication often uses connected components or graph clustering because many records in one source may describe the same entity.
  • Product, company, and location data may need conflict resolution because several plausible clusters can overlap.

Global consistency matters. If A matches B and B matches C, the system still needs to decide what to do when A and C look weak. Pairwise prompts alone do not solve that. The clustering layer should make those conflicts visible and version the outcome.

Publish a canonical view

The canonical table is the serving layer. It is what analytics, search, CRM workflows, support tools, procurement systems, or agent workflows read.

The canonical row should be derived from the cluster and its evidence. It should not erase the evidence.

For each attribute, choose a winning value with explicit survivorship logic. A trusted source may beat a newer source for tax ID. Recency may matter more for address. Completeness may matter more for product descriptions. A human override may win for legal names.

Attribute-level survivorship is usually better than row-level merging because different fields have different sources of authority.

AttributePossible winning rule
Legal namegovernment registry or reviewed source wins
Display namemost complete recent source wins
Addressvalidated postal source wins unless manually overridden
Product titletrusted catalog source wins, enriched with model and pack size
Email or phonemost recent verified contact wins
Categorycontrolled taxonomy mapping wins

This is the difference between a reference table and a pile of merged rows. The reference table can explain itself.

A minimum data model

You do not need a large platform to start, but the storage model should separate evidence from publication.

TablePurpose
source_recordImmutable input rows from each source system
candidate_edgeCandidate pairs created by blockers
match_evidenceScores, labels, explanations, costs, and model versions
review_decisionHuman or LLM adjudication for uncertain cases
entity_clusterCurrent and historical resolved groups
cluster_membershipWhich records belong to each cluster version
canonical_entityStable entity IDs for serving systems
canonical_attribute_valueCurrent winning value for each attribute
entity_attribute_evidenceAll observed values behind each winning attribute

This model is deliberately boring. It gives you the thing that most entity resolution projects eventually need: a way to explain why the current entity exists, which records support it, and what would change if matching or survivorship rules changed.

How to evaluate it

Pairwise precision, recall, and F1 are still useful, but they are not enough.

Measure blocker recall so you know whether true matches are reaching the scorer. Measure candidate volume so you know whether the scorer is being flooded. Measure pairwise precision and recall for the scorer. Measure cluster quality when the output is deduplication. Measure review load, abstention rate, latency, and cost.

If LLMs are involved, also measure prompt sensitivity. A matching system that changes materially because the prompt was reworded is not stable enough to operate without guardrails. Token cost and runtime should be reported next to quality, because a small F1 gain may not justify a large operational cost.

The hardest errors are usually false positives that merge distinct entities. They pollute the canonical view and can be difficult to unwind. For many domains, the first production target should be high precision with a review queue for ambiguous cases, then gradual recall improvement.

A practical starting plan

  1. Pick one entity type and write the merge boundary in plain language.
  2. Ingest the raw source records without overwriting them.
  3. Normalize the fields that clearly matter for matching.
  4. Build two or three simple blockers and measure candidate volume.
  5. Label a small review set from real candidate pairs.
  6. Train or configure a cheap scorer before adding any LLM calls.
  7. Route only uncertain cases to a human or LLM and store the decision as evidence.
  8. Build cluster versions from the accepted matches.
  9. Publish a canonical view with attribute-level survivorship.
  10. Track precision, recall, cluster quality, review load, latency, and cost.

That sequence works whether the records are customers, suppliers, products, patients, assets, companies, or locations. The domain changes the fields and rules. The architecture stays stable.

Common failure modes

  • matching every pair instead of blocking first
  • keeping only the golden record and losing the evidence
  • treating all fields as equally authoritative
  • using a single threshold without a review band
  • evaluating pairwise F1 while the real output is clusters
  • letting LLM answers update the canonical layer without versioned evidence
  • failing to distinguish one-to-one linkage from many-record deduplication
  • changing normalization or survivorship rules without snapshot versions

Most of these failures come from compressing the whole problem into "are these two records the same?" That question is useful, but it is only one piece of the system.

Sources

Related entries