Drupal is a registered trademark of Dries Buytaert
Release: Leaflet 10.4.11 Minor update available for module leaflet (10.4.11). Release: Session Inspector 1.0.8 Minor update available for module session_inspector (1.0.8). Release: Migrate QA 2.0.4 Minor update available for module migrate_qa (2.0.4). Release: CKEditor Description List 3.0.0 Major update available for module ckeditor_descriptionlist (3.0.0). Release: FlowDrop 2.4.0 Minor update available for module flowdrop (2.4.0). Release: JWT Token Refresh 1.0.4 Minor update available for module jwt_token_refresh (1.0.4). Release: ConReg 1.0.0-beta1 First beta version released for module conreg (1.0.0-beta1). Release: AI Image Studio 1.0.0-beta8 New beta version released for module ai_image_studio (1.0.0-beta8). Usage Milestone: Role Theme Switcher Module role_theme_switcher crossed 1,000 active installs. Module Revived: Decoupled Router 2.0.7 Module decoupled_router updated after 11 months of inactivity (2.0.7).

Fuzzy Term Merge

5 sites No security coverage
View on drupal.org

This module helps administrators find and merge duplicate or near-duplicate taxonomy terms using fuzzy string matching. It identifies potential matches and provides a guided wizard to review and merge them, preventing fragmented content and improving search accuracy.

Finds and cleans up near-duplicate taxonomy terms. Fuzzy string matching surfaces likely duplicates within a vocabulary; a short wizard walks you through reviewing and merging them.

Why

Vocabularies accumulate duplicates over time — "Aluminium" vs "Aluminum", "T-Shirt" vs "Tshirt". They fragment content, break faceted search, and skew reporting. Merging them by hand is slow and error-prone.

What it does

Path-aware matching

Every pair is scored on two axes and blended into one match score:

  • Leaf % — name similarity (similar_text() / levenshtein()).
  • Path % — how much of the two terms' taxonomy ancestry overlaps.

Comparison spans the whole vocabulary, so the same name in two different branches (e.g. "Apple" under Fruit vs Company) is surfaced but flagged with a low path score — the signal that tells a homonym apart from a true duplicate. Each term shows its hierarchy breadcrumb, and the score expands to reveal the leaf/path breakdown.

Safe hierarchy handling on merge

  • Children of a merged-away term are re-parented onto the surviving term — no orphaned subtrees.
  • Optionally, parent terms left empty by the merges (no children, no content references) can be pruned too — opt-in, with a preview of exactly what will be removed.

The rest

  • Three-step wizard: analyse → choose direction per pair → confirm & execute.
  • Configurable similarity threshold and minimum term length; AJAX results, no page reload.
  • Usage counts across all entity-reference fields (nodes, products, paragraphs, media, etc.) to help pick the term to keep.
  • Batch processing for vocabularies of any size.
  • Multilingual, with fallback to the default translation.
  • Drush command (ftm-tfd) for command-line audits.
  • Session-scoped state via PrivateTempStore; no custom schema, no custom permissions.

Requirements

  • Drupal 10 or 11, PHP 8.1+
  • Term Merge 2.x — performs the merge and defines the merge taxonomy terms permission
  • Drush (optional) — only for the ftm-tfd command

Install

Require via Composer, enable alongside Term Merge, and grant merge taxonomy terms to the relevant roles. A Fuzzy merge tab appears on each vocabulary's admin page.

Limitations

  • Merges are permanent — no undo. Back up before running on production.
  • levenshtein() is limited to 255-byte strings (shown as "n/a" beyond that).

Activity

Tracked releases
3
Tracked since
Jul 2026
Latest release
2 weeks ago
Releases (12 mo)
3 ▲ from 0
Maintenance
Active

Release Timeline

Releases

Version Type Release date
1.0.0-alpha3 Pre-release Aug 5, 2026
1.0.0-alpha2 Pre-release Jul 23, 2026
1.0.0-alpha1 Pre-release Jul 1, 2026