What Is Faceted Navigation? β Definition and How It Works
Learn why filter combinations create combinatorial URL explosion, and how to crawl faceted sites without a trap.
Faceted navigation lets a visitor narrow a listing by multiple independent attributes β brand, size, colour, price band, rating β usually reflected in the URL.
1. The Combinatorial Problem
Facets multiply. A category with five facets of ten values each yields, in principle, every subset of every combination:
/shoes?brand=a
/shoes?brand=a&size=42
/shoes?brand=a&size=42&colour=black
/shoes?size=42&brand=a β same set, different order
/shoes?brand=a&size=42&colour=black&sort=price_asc
/shoes?brand=a&size=42&colour=black&sort=price_desc β same items, different order
Two things make it worse than the raw combination count: parameter order produces distinct URLs for identical results, and sort parameters produce distinct URLs for identical sets.
The result is effectively unbounded URL space over a finite product catalogue β the classic crawler trap.
2. Why It Is a Trap, Not Just Waste
A crawler following every facet link never finishes, and the damage compounds:
- Crawl budget is consumed on near-duplicate pages.
- The same products are fetched hundreds of times under different filters.
- Genuinely new content is never reached, because the frontier is saturated.
- The target absorbs a large volume of pointless requests.
This is one of the most common ways a crawl fails to complete, and it fails quietly β the crawler is busy, so nothing looks broken.
3. Crawling a Faceted Site Correctly
The strategy is to enumerate products, not filter combinations.
- Find the unfiltered listing and paginate it fully. That reaches every product once.
- Exclude facet parameters from the frontier by default, with an allowlist for the few that matter.
- Drop sort parameters entirely β they never change the set.
- Normalise parameter order in the dedup key so reorderings collapse.
- Cap facet depth at one or two, if facets are needed at all.
- Prefer the sitemap, which usually lists canonical product URLs and no facets.
FACET_ALLOW = {"page", "category"} # everything else is dropped for crawling
def crawl_url(url):
parts = urlsplit(url)
kept = [(k, v) for k, v in parse_qsl(parts.query) if k in FACET_ALLOW]
kept.sort() # order-independent
return urlunsplit((parts.scheme, parts.netloc, parts.path, urlencode(kept), ""))
4. When Facets Are the Data
Sometimes the facet is the point β collecting how many products exist per brand, or per price band. In that case:
- Enumerate one facet dimension at a time, not combinations.
- Read the result count rather than fetching every page, where the site displays one.
- Never cross facets unless the specific intersection is genuinely required.
One dimension at a time turns a combinatorial problem into a linear one, and usually answers the question just as well.
5. What Sites Do About It
Understanding the site's own mitigations tells you which URLs to trust:
| Technique | Meaning for you |
|---|---|
rel=canonical to the unfiltered page |
The site says facets are duplicates |
noindex on facet combinations |
Same signal, indexing-side |
robots.txt disallowing facet parameters |
An explicit instruction to skip them |
| Facets in a fragment rather than the query | No new URLs at all |
| POST-based filtering | Facets do not appear in URLs |
A canonical pointing from a facet page to the unfiltered listing is the site telling you the facet page is not a distinct resource. Honour it.
6. Detecting You Are In a Trap
Signals worth alerting on:
- Frontier size growing while unique products discovered stays flat.
- A rising share of URLs with three or more query parameters.
- The same product identifiers appearing under many URLs.
- Crawl depth increasing without new content.
The second one is the cheapest check and catches it early.
7. The Underlying API Is Often Better
Faceted listings are typically rendered from a search or catalogue API that accepts filters as parameters and returns JSON. Finding that endpoint usually gives:
- The total result count without pagination.
- Facet value lists directly.
- Clean structured records.
- One request where the interface needed several.
That is generally a far better answer than crawling the rendered facets.
8. Summary
Faceted navigation exposes filter combinations as URLs, and because parameters combine and reorder freely it creates effectively unbounded URL space over a finite catalogue β the classic crawler trap, which fails quietly because the crawler stays busy.
Enumerate products via the unfiltered listing or sitemap rather than following facets, drop sort parameters and normalise parameter order in the dedup key, honour canonicals pointing away from facet pages, and prefer the underlying catalogue API where one exists.