CROP
ProjectsParts ServicesCatalog

Manufacturer Aliases Reference

The manufacturer alias system enables partial manufacturer name queries to work in autocomplete. For example: - "newh" → "New Holland" - "nh" → "New Holland" -...

Manufacturer Aliases Reference

Quick Summary

The manufacturer alias system enables partial manufacturer name queries to work in autocomplete. For example:

  • "newh" → "New Holland"
  • "nh" → "New Holland"
  • "briggs" → "Briggs & Stratton"
  • "gp" → "Great Plains"

Features

✅ Fast O(1) lookups (< 0.05ms per query) ✅ Case-insensitive matching ✅ 50+ aliases for 14 manufacturers ✅ No external dependencies ✅ Fully tested and documented

Alias Mappings

New Holland (21 aliases including variants)

AliasMatches
nhExact code match
newhPartial prefix
new-hollandHyphenated variant
newhollandCompact variant
new hollandSpaced variant

McHale (2 aliases)

Alias
mch
mchale

Briggs & Stratton (5 aliases)

Alias
bgs
briggs
stratton
briggs-stratton
briggs and stratton

Great Plains (3 aliases)

Alias
gp
great-plains
great plains

Club Car (4 aliases)

Alias
cc
clubcar
club car
club-car

Kawasaki (2 aliases)

Alias
kws
kawasaki

Ventrac (2 aliases)

Alias
ven
ventrac

Hotsy (2 aliases)

Alias
hsy
hotsy

EZ-Trail (3 aliases)

Alias
ezt
ez-trail
eztrail

Dion AG (3 aliases)

Alias
dio
dion
dion ag

AMCO (2 aliases)

Alias
amc
amco

Harvest Tec (4 aliases)

Alias
ht
harvesttec
harvest-tec
harvest tec

Ag-Bag (3 aliases)

Alias
agb
ag-bag
agbag

HLA (1 alias)

Alias
hla

API Reference

normalizeManufacturerQuery(query: string): string[]

Convert a query to matching manufacturer names.

import { normalizeManufacturerQuery } from './config/manufacturers';

normalizeManufacturerQuery('newh');           // ['New Holland']
normalizeManufacturerQuery('nh');             // ['New Holland']
normalizeManufacturerQuery('briggs');         // ['Briggs & Stratton']
normalizeManufacturerQuery('unknown');        // []
normalizeManufacturerQuery('');               // []

asManufacturer(key: string): { name: string; code: string }

Get manufacturer info from an alias or direct key.

import { asManufacturer } from './config/manufacturers';

asManufacturer('newh');        // { name: 'New Holland', code: 'NH' }
asManufacturer('nh');          // { name: 'New Holland', code: 'NH' }
asManufacturer('New Holland'); // { name: 'New Holland', code: 'NH' }
asManufacturer('McHale');      // { name: 'McHale', code: 'MCH' }
asManufacturer('unknown');     // { name: 'unknown', code: 'UNK' }

Reverse lookup helper

Need to inspect all aliases for a manufacturer? Filter the map:

import { DEFAULT_ALIASES } from '@crop/shared-catalog';

const aliases = Object.entries(DEFAULT_ALIASES)
	.filter(([_, info]) => info.name === 'New Holland')
	.map(([alias]) => alias);
// aliases => ['nh', 'newh', 'new-holland', 'newholland', 'new holland']

Usage in Autocomplete

Integration Point

File: services/search/src/utils/autocomplete-suggestions.ts (lines 1061-1130)

Add this import:

import { normalizeManufacturerQuery } from '@crop/shared-catalog';

Update manufacturer query:

if (!skipExpensiveQueries && caps.manufacturer > 0) {
  const lowerQuery = query.toLowerCase();
  const normalizedMfgNames = normalizeManufacturerQuery(lowerQuery);

  searches.push({ index: indexName, preference });
  searches.push({
    size: 0,
    _source: false,
    query: {
      bool: {
        should: [
          // existing queries...

          // NEW: Alias expansion
          ...(normalizedMfgNames.length > 0
            ? [
                {
                  terms: {
                    'manufacturer.name.keyword': normalizedMfgNames,
                    boost: 4.5,
                  },
                },
              ]
            : []),
        ],
      },
    },
    aggs: {
      manufacturers: {
        terms: {
          field: 'manufacturer.name.keyword',
          size: caps.manufacturer,
        },
      },
    },
  });
}

Performance

Lookup Speed

  • Single query: < 0.05ms
  • 1000 queries: < 50ms
  • Complexity: O(1) - Direct hash table lookup

Memory

  • Alias map size: ~2KB
  • Per-query allocation: ~0.2KB (temporary)
  • No caching needed: Lookup is already instant

Testing

Run Tests

bun test src/__tests__/manufacturer-aliases.test.ts

Test Coverage

  • ✅ All 14 manufacturers have aliases
  • ✅ Case insensitivity
  • ✅ Edge cases (empty, whitespace, unknown)
  • ✅ Performance benchmarks
  • ✅ Query integration scenarios

Manual Testing

Query 1: Partial prefix

curl "http://localhost:3001/api/autocomplete?q=newh"

Expected: New Holland in suggestions

Query 2: Manufacturer code

curl "http://localhost:3001/api/autocomplete?q=nh"

Expected: New Holland in suggestions

Query 3: Spaced name

curl "http://localhost:3001/api/autocomplete?q=new%20holland"

Expected: New Holland in suggestions

Query 4: Non-manufacturer

curl "http://localhost:3001/api/autocomplete?q=hydraulic"

Expected: Normal results, no manufacturer alias applied

Files

FilePurpose
packages/shared-catalog/src/config/manufacturers.tsAlias definitions and normalization
services/search/src/__tests__/manufacturer-aliases.test.tsUnit tests
services/search/src/utils/autocomplete-suggestions.tsIntegration point (lines 1061-1130)
docs/DEFAULT_ALIASES_INTEGRATION.mdFull integration guide

Adding New Aliases

To Add a New Alias

  1. Open packages/shared-catalog/src/config/manufacturers.ts
  2. Add to DEFAULT_ALIASES:
export const DEFAULT_ALIASES: Record<string, { name: string; code: string }> = {
  // Existing aliases...

  // New alias (example: "holland" for New Holland)
  'holland': { name: 'New Holland', code: 'NH' },
};
  1. Update tests in services/search/src/__tests__/manufacturer-aliases.test.ts
  2. Run tests: bun test src/__tests__/manufacturer-aliases.test.ts

Common Questions

Q: Why is "new" not an alias but "newh" is?

A: Single-word short prefixes risk false positives ("new" could match non-manufacturer terms). "newh" is long enough to be a safe alias.

Q: Can I have multiple manufacturers respond to one alias?

A: No, each alias maps to exactly one manufacturer. This ensures predictable search behavior.

Q: What if a user types "NH Tractor"?

A: The alias system handles "NH", then the rest of the query ("Tractor") is processed normally. Elasticsearch handles multi-word matching.

Q: Is alias matching case-sensitive?

A: No, all lookups are case-insensitive. "NH", "nh", "Nh" all work.

Q: How does this affect Elasticsearch aggregations?

A: The normalization happens client-side before the query is sent. ES receives the expanded query and returns results normally.

On this page