Skip to main content
NewNMC’s advertising guidelines for doctors are in force from 6 Oct 2026. See what to change, and get a free compliance auditNew NMC advertising rules for doctors: what to change
SEO

Faceted Doctor Directories: Which Filter Combinations Deserve an Indexable URL

A decision matrix for specialty, city, language, gender and availability filters on a doctor directory: which combinations to index, canonicalise, noindex or keep out of the crawl.

Faceted Doctor Directories: Which Filter Combinations Deserve an Indexable URL

This post is for the person who owns the "Find a Doctor" directory on a hospital or clinic-chain website: usually an SEO lead, a product manager or a web developer who has been asked why Google is crawling thousands of filter URLs and ranking none of them. It assumes you already know what a canonical tag and a robots.txt rule are. What it adds is a way to decide, filter by filter, what each URL should be allowed to do.

A doctor directory is a classic faceted navigation problem. Specialty, city, language, gender, insurance, fee band and "available today" can each be combined with the others. Ten specialties, twelve cities, six languages, two genders and an availability toggle already produce thousands of possible pages, most of which show the same three doctors in a different order. Some of those pages match real searches ("female gynaecologist in Pune"). Most do not.

The answer is not "index everything" or "block everything". It is a rule set, written down before the developers build it, that sorts every filter combination into one of four outcomes: index, canonicalise, noindex, or keep out of the crawl.

What Google actually says about faceted URLs

Google's guidance on managing faceted navigation separates two goals. If filtered URLs do not need to appear in Search, prevent crawling with robots.txt rules on the filter parameters or keep the filter state after a URL fragment. If they do need to appear, keep them crawlable and follow the URL practices on the same page.

Several details in that document matter for a directory:

  • Use the standard & between parameters. Commas, semicolons and brackets are often not read as separators.
  • If filters sit in the path, keep a fixed order, so /doctors/cardiology/pune/ never also exists as /doctors/pune/cardiology/.
  • Return a 404 for a combination with no results, rather than a soft page that says "0 doctors found" with a 200 status.
  • rel="canonical" may reduce crawling of the non-canonical versions over time, but gradually. It is not a crawl-budget switch.

Google's page on consolidating duplicate URLs adds two warnings that apply here. Do not use robots.txt to choose a canonical, and do not use noindex to choose a canonical within one site. Each tool has one job, and the matrix below respects that.

The four outcomes, defined

Index. The URL has a self-referencing canonical, appears in the sitemap, is linked from crawlable navigation, and has its own title, heading and intro. It earns this only if it has a distinct search demand and distinct content.

Canonicalise. The URL stays crawlable and usable, but its canonical points at a parent or cleaner version. Use this for near-duplicates that users may legitimately reach, such as the same list with a different sort order.

Noindex. The URL is crawlable, so Google can see the tag, but it asks not to be indexed. Use it for pages that are useful to a visitor but should not compete in results. Note that a noindex URL still consumes crawl effort, because Google must fetch it to see the tag.

Keep out of the crawl. A robots.txt disallow on the parameter pattern, or filter state that never becomes a crawlable URL. Use it for combinations that have no search value and would multiply into the thousands. The trade-off is that Google cannot see a canonical or noindex on a blocked URL, so never block a URL and also rely on a tag on it.

The decision matrix

Here is a starting matrix for a multi-specialty hospital directory in India. Treat it as a hypothesis to test against your own Search Console data, as the next section explains.

Filter combinationExampleDefault outcomeWhy
Specialty aloneCardiology doctorsIndexClear demand, stable list, anchor of the directory
City aloneDoctors in PuneIndex if the site has a real presence there; otherwise canonicalise to the directory rootLocation pages need genuine local content
Specialty + cityCardiologists in PuneIndex when 3 or more doctors practise there (hypothetical threshold); otherwise 404 or canonicalise to specialtyHighest-intent pattern for directories
Specialty + city + languageHindi-speaking paediatricians in PuneIndex only where Search Console shows demand and the doctor count supports it; else canonicalise to specialty + cityLanguage is a real patient need in some cities, not all
Specialty + genderFemale gynaecologistsIndex for specialties where the query is common (women's health); otherwise noindexDemand is concentrated in a few specialties
Specialty + city + genderFemale gynaecologists in PuneTest case. Index only with enough doctors and a distinct headingThin quickly; each doctor's profile does the real work
Any + availability ("available today")Cardiologists available todayKeep out of the crawl, or noindexThe list changes hourly; no stable page to rank
Any + sort orderSorted by experienceCanonicalise to the unsorted URL, or keep out of the crawlSame doctors, different order
Any + insurance, fee bandCashless insurance filterNoindex or keep out of the crawl by defaultIndividual-level data changes often and rarely matches a search
Three or more filters stackedSpecialty + city + language + genderKeep out of the crawlCombinatorial explosion, few results each
Page 2+ of any indexable listCardiologists in Pune, page 2Self-canonical, crawlable linksEach page has its own canonical; do not point all pages at page 1

The last row follows Google's pagination guidance, which says not to make the first page of a sequence the canonical for every page in it.

Four rules that settle most edge cases

A page earns an index only with content that differs. If the specialty + city page and the specialty + city + language page show the same doctors, the second adds no value to Google. If it shows a different subset, with an introduction written for that audience and a heading that names the language, it can.

Never index a page whose content changes hourly. "Available today" is the clearest example. A slot-based filter helps the visitor choose, but a list that is true at 10:00 and false at 14:00 is a poor landing page. Apply the filter with JavaScript or a parameter that is blocked from crawling, and let the profile pages carry availability.

Empty means 404. Generate links only to combinations that have at least one doctor, and return a 404 status for any that do not. A "no doctors found" page returning 200 is a soft error that will accumulate in Search Console.

One canonical logic, written in code. Do not let the template decide the canonical URL by whatever the browser address shows. Compute it from a whitelist of indexable facets and render the same tag on every variant.

Want this applied to your practice? Get a free seo audit.

Book my free audit

Run the test: impressions per facet URL

The matrix is a hypothesis. Search Console can confirm or reject it. This is a method, not a result: we are not reporting numbers from any one directory.

  1. In Search Console, open Performance, choose the Pages view and set a date range of at least three months. Export the table of pages with clicks and impressions.
  2. Classify every URL in a spreadsheet by pattern: root, specialty, city, specialty + city, specialty + city + language, gender, availability, sort, other. A regular expression on the path or parameter name does most of the work.
  3. For each class, count how many URLs exist (from a crawl) and how many appear with at least one impression. The ratio tells you how many filter pages Google considers worth showing at all.
  4. Within each class, sort by impressions and look at the distribution. A class where a handful of URLs carry nearly all impressions is a class where an allowlist will work. A class where impressions are spread thinly across thousands of URLs is one to suppress.
  5. Check the queries on the high-impression filter URLs. If the queries match the facet ("female gynaecologist pune"), the page has found real demand and deserves a proper heading and copy. If the queries are unrelated or are the doctor's name, the URL is acting as a doorway to a profile and may not deserve independent indexation.

Also compare with the crawl. A crawler such as Screaming Frog or Sitebulb will count the faceted URLs reachable from internal links. Server logs, covered in a separate technical SEO method, show how many of those Googlebot actually requests. A big gap between URLs discovered and URLs with impressions is the cost of the current setup.

Decision rule for a threshold

Choose the threshold before you look at individual pages, so the decision does not drift. A workable rule: a facet combination becomes indexable if it satisfies all three tests.

  • Demand: its URL, or its exact query pattern, has recorded impressions in the period, or keyword research shows a matching query.
  • Substance: it lists at least a minimum number of doctors that you set (three is a reasonable starting value for a specialty + city page; the right number depends on your network).
  • Distinctness: it has an intro, title and heading that differ from its parent, and the doctor set is not identical to the parent's.

A combination that fails any test is canonicalised to its parent or kept out of the crawl. Review the rule quarterly, because a new clinic opening in a city can move a combination from fail to pass.

Implementation details teams get wrong

Sitemaps. List only the indexable facet URLs. A sitemap that includes sorted and filtered variants contradicts the canonical logic and weakens both signals.

Internal links. The filter widget should link crawlably only to allowed combinations. Links to blocked combinations that appear in HTML anchors invite crawling of URLs you meant to keep out. Google also notes that nofollow on facet links works only if every link to the URL is marked.

Titles and headings. Generate them from the facet values, not from the parent template. "Cardiologists in Pune | Hospital Name" is a title; "Doctors | Hospital Name" on every variant is the signal of duplication.

Doctor data and compliance. The directory should show only what the doctors have approved and what the hospital can verify, such as registration details and qualifications as the clinical or medical affairs team confirms them. Avoid labels such as "best" or "top" cardiologist, which sit badly with the rules on advertising by doctors in India; check wording with your compliance owner and the NMC guidance on professional conduct.

Single-page apps. If the directory is built client-side, the server must still return the correct status code and canonical in the initial HTML for each facet URL. Our separate post on rendering covers how to test that.

Where to start this week

  1. Export a crawl of every internal URL with a query string or more than two path segments under the directory.
  2. Classify them with the table above and count each class.
  3. Pull the Search Console page export and join impressions to the classes.
  4. Write the allowlist: which classes are indexable, with the three tests.
  5. Ask a developer to return 404 for empty combinations and compute the canonical from the allowlist.
  6. Add disallow rules for sort, availability and stacked-filter parameters, and remove those URLs from the sitemap.
  7. Re-run the export after eight to twelve weeks and compare the number of indexed facet pages with the number you intended.

The same discipline applies to condition and location pages. If you are planning the wider structure, our notes on provider page optimisation and programmatic SEO for healthcare cover how directory pages fit the rest of the site, and the technical SEO audit is where a facet review usually starts. When two directory pages compete for the same query, the keyword cannibalisation entry explains the symptom.

Filed underfaceted navigation doctor directory SEOfaceted navigation SEOdoctor directory filters indexingfind a doctor page SEOhospital doctor listing SEO

About the author

Co-Founder & CTO · Gurugram, India

Arush builds the systems the rest of the company runs on — the patient-acquisition pipelines, the AI chatbots, the analytics that tie a single click to a booked appointment. If a campaign reports a number, it's because something his team built is tracking it.

Free guide · 17 pages

The Patient Acquisition Blueprint

A 90-day plan from first search to booked appointment.

The Pioneers Brief — one essay, three benchmarks, one teardown, every Thursday. Subscribe free →

Free seo audit

Your next chapter starts with a conversation.

Three quick questions. We come prepared with a plan for your specialty and city.

  • A 30-minute call with a healthcare specialist
  • Your top three growth opportunities, in writing
  • Honest advice — even if that means not hiring us
  • No obligation and no hard sell
You’ll speak with a senior strategist
Consultations are hosted by Arush Thapar’s team.
Step 1 of 3Takes 30 seconds

What do you want to improve first?

Details stay privateNo obligationReply within 1 working day

Client portfolio · Healthcare websites

Work relevant to faceted doctor directories which filter combinations deserve an.

Explore client work →