← field notes

How a search engine decides a page is duplicate

The problem search engines actually have

A search engine does not have a duplicate content problem in the way most site owners imagine it. It is not scanning the web looking for people to punish. It has a resource allocation problem: it can only crawl and index a fraction of the pages that exist, and it wants every crawl budget dollar and every index slot spent on something a user hasn’t already seen. When a search engine detects duplication, the goal is almost always consolidation, not punishment. Two identical pages get folded into one entry in the index, one of them gets picked as the “canonical” version, and the other quietly stops showing up in results. No page gets penalized in the sense of demoted below where it deserves to be. It just stops competing on its own.

That distinction matters because it shapes the whole detection pipeline. A system built to punish would need to prove intent. A system built to consolidate just needs to prove similarity, which is a much cheaper and much more mechanical problem.

Fingerprinting a page before comparing it to anything

Before a search engine can decide two pages are duplicates, it has to represent each page as something comparable. Raw HTML is a bad candidate for this. Two pages can render identically to a human while differing in whitespace, comment order, inline script blocks, ad slot IDs, or timestamp strings buried in the markup. Byte-for-byte comparison would call almost nothing a duplicate and would also call near-duplicates completely unrelated.

Instead, crawlers build a normalized representation of the page: strip boilerplate like navigation, footers, and ads, extract the main text content, lowercase it, remove punctuation, and often collapse it into a set of overlapping word sequences called shingles. A page becomes a bag of five-word or seven-word chunks rather than a stream of characters. From that shingle set, the system computes a compact fingerprint, commonly through a technique like MinHash, that lets it estimate how much two documents overlap without storing or comparing the full text of every page against every other page on the internet. That last part is the whole point. Comparing every page to every other page is computationally impossible at web scale, so the fingerprint has to be small enough to index and query cheaply while still preserving enough signal that similar documents produce similar fingerprints.

Near-duplicate clustering, not exact matching

Exact duplicate detection catches the easy cases: a page mirrored verbatim, a print-friendly version of an article, a staging copy of a site that never got taken down. Near-duplicate detection is where most of the real work happens, because the actual web is full of content that is 80 to 95 percent the same but not identical.

Syndicated news wire copy is the classic example. A wire story gets published on hundreds of outlets with a different headline, a different byline, a related-articles sidebar, and maybe a paragraph of local context added at the top or bottom. Templated e-commerce listings are another: thousands of product pages sharing the same boilerplate description with only the size, color, or SKU changed. Scraped content sits in the same bucket, often with light rewriting, synonym swaps, or paragraph reordering applied specifically to dodge exact-match checks. None of these tricks change the underlying shingle distribution much, because the semantic content and structure are still overwhelmingly similar. Locality-sensitive hashing is built precisely to catch that: it maps similar inputs to the same or nearby buckets even when the surface text has been shuffled, so documents don’t need to match exactly to land in the same duplicate cluster.

Once a cluster of near-duplicate pages is identified, the search engine has to pick one representative to show in results and suppress the rest for that query. Selection criteria commonly include which version was indexed first, which domain has stronger overall authority, which URL is marked as canonical via an on-page signal, and which version accumulated more external links or citations. The suppressed pages usually still exist in the index; they’re just deprioritized for queries where the canonical version already satisfies the search intent.

Canonicalization signals the crawler looks for

Site owners can hand a search engine an explicit answer instead of leaving it to infer one. The rel=canonical link tag is the most direct version of this: it tells the crawler “this page and that other page are the same content, treat the other one as authoritative.” Search engines generally respect this signal but treat it as a strong hint rather than an absolute instruction, because it’s trivially abusable. A malicious or careless site could canonicalize every page on the internet to a single competitor’s URL in an attempt to erase that competitor from search results, so crawlers cross-check the canonical tag against their own similarity analysis before honoring it. If the two pages the tag points between aren’t actually similar by the crawler’s own fingerprinting, the tag gets ignored.

Other canonicalization signals include consistent internal linking to one preferred URL variant, XML sitemap entries, and HTTP redirects between duplicate paths like a www and non-www version of the same domain, or a trailing-slash and non-trailing-slash pair. Each of these is a small vote toward which URL should own the content in the index, and the crawler weighs them together rather than trusting any single one blindly.

Why content spinning and thin rewrites keep failing

A recurring pattern in low-quality content operations is taking a source article and running it through paraphrasing to produce a version that reads as unique to a casual glance. This gets built on a flawed premise: it assumes duplicate detection is doing something close to string matching, when in practice it’s operating on semantic and structural similarity. Shingle-based fingerprinting is fairly resilient to synonym substitution, because most of the shingles in a document are unaffected by swapping a handful of words, and the overall n-gram overlap with the source stays high. Sentence reordering has a similar problem: the local word sequences inside each sentence survive largely intact even if the sentences themselves get shuffled.

Modern ranking systems have also layered semantic embedding comparison on top of lexical shingle matching, which closes another gap. Embeddings represent meaning rather than exact word sequences, so a rewritten paragraph that says the same thing in different words can still register as highly similar to the source at the embedding level even when the shingle overlap has been deliberately reduced. This is why thin spun content tends to get clustered with its source anyway, often after a short delay while the crawler accumulates enough signal to make the call with confidence. The delay is not a loophole. It’s a natural consequence of a system that would rather wait for more evidence than misclassify prematurely, and it means volume-based content operations tend to accumulate a large batch of pages that all eventually collapse into the same suppressed cluster at once.

The asymmetry that makes this hard to game

The deeper reason duplicate detection holds up reasonably well against adversarial content is structural: a search engine only has to correctly place a document in the same cluster as its source once, using any one of several independent signals, lexical shingles, semantic embeddings, canonical tags, link graph position, crawl timing. A content operation trying to evade detection has to defeat all of those signals simultaneously, every time, indefinitely, since the crawler re-evaluates pages as it recrawls the web and as its models improve. That asymmetry, one correct match wins versus every evasion attempt has to hold, is the same shape seen across most of the adversarial infrastructure of the web, from bot detection to device fingerprinting. The defender doesn’t need to be right every time. It needs the attacker to be wrong once.

Want more breakdowns of how the internet’s detection systems actually work under the hood? Head back to the Hidden Internet homepage for the rest of the series.

Get new guides and videos first — join the Telegram channel.

watch
The Hidden Internet on YouTube

Every field note starts as a short documentary. Watch the systems in this piece explained on screen.

subscribe →
read on
More field notes

The rest of the series on how the modern internet detects, tracks, and sorts the traffic that reaches it.

browse the archive →