Your customer describes the part. Your system needs you to name it.
The situation
A distributor's item master has tens of thousands of lines and fifteen years of history. Nobody built it; it accumulated. Two entries for the same bolt, differing by a space. A description field that three generations of staff used differently. Attributes that live in the description for some ranges and in proper columns for others.
Against that, the incoming order does not carry a part number. It carries a sentence: Sechskantschraube M12×60, V2A, Vollgewinde, 250 St. Somebody in inside sales reads it, knows what it means, and finds it — usually in under a minute, because they have been doing it for eleven years.
That knowledge is not written down anywhere. When that person is on holiday, orders wait. When they leave, the vacancy is posted, and it stays open, because what is being hired for is eleven years of a catalogue nobody has documented.
The constraint
Being close is being wrong.
This is what separates the problem from search relevance. A recommendation engine that returns something similar is doing its job. A matching system that returns something similar has just put the wrong part on a construction site, and the cost of that is not a returned item — it is a stopped job and a conversation about liability.
The second constraint is that the catalogue cannot be rebuilt first. Normalising the item master up front loads twelve months of work before anything runs, and asks a purchasing director to fund a data project on the promise of a later benefit. The matching has to work against the item master as it is, and improve it as a side effect rather than as a precondition.
What we built
Attribute resolution against the governing standard, not string matching against a description.
An incoming line is decomposed into typed attributes — thread system, diameter, pitch, length and the datum it is measured from, material group, property class, head form, governing standard — and each attribute carries whether it was stated in the line, inferred from convention, or missing entirely. That distinction is the whole system. M8×40 A2-70 states five facts. Two more are assumed by convention. The rest — head form, drive, governing standard, threaded length, finish — is not in the line at all, and a matcher that cannot tell those three cases apart will silently guess on the ones that matter.
Standards are resolved as families with their actual constraints, not as a lookup table. DIN 933 and ISO 4017 are the same fully threaded hex bolt at most diameters — and at M10, M12, M14 and M22 the head takes a different spanner. A cross-reference that maps one standard onto the other without carrying the diameter is wrong four times in every size range, and it is wrong invisibly.
That is also what the customer is actually buying. A part that is dimensionally close but belongs to a different standard family is not a near match. It does not meet the specification the customer wrote down — and where the part goes into structural steelwork under EN 1090, or into pressure equipment under PED 2014/68/EU, that gap is a conformity question rather than a returns question. What the system produces is a line with the standard it satisfies named, and the attributes that decided it recorded — so the answer to "why this part" exists before anyone asks.
And the standard is not only the part. A2-70 is defined by ISO 3506-1. 1.4301 is the material number under EN 10088, which is what V2A means when a German purchasing department writes it. A delivery that requires an EN 10204 3.1 certificate needs a part that can be traced to one — and a line that matches on every dimensional attribute but cannot be traced is still not deliverable. Those facts sit in different fields, in different systems and usually in different departments, so the attribute model carries the certificate requirement next to the dimensional ones rather than leaving it as paperwork for later.
The worked example here is fasteners because it is the family with the most public standards to disagree about, and the one where being wrong is easiest to show. The model is per family: a valve carries a pressure class and a face-to-face length under EN 558, a flange carries EN 1092-1 with a type and a pressure stage, a bearing carries an ISO designation and a clearance class. DIN 931 and DIN 933 differ by one attribute that is often not written in the line at all. What is proven today is fasteners on real catalogues. What generalises is the shape — typed attributes, standards resolved as families, and a refusal when the line does not carry enough to decide.
Substitution rules are held in a rules engine and owned by the customer's engineer. We built the engine. We did not decide what may stand in for what, and we declined to, because that decision carries liability that belongs on their side of the table.
And there is a refusal path. When the line does not carry enough to decide, the system does not select the nearest candidate — it stops and produces an exception with the missing attribute named and the question already formed. A queue of formed questions is work. A queue of near-misses is rework.
One order line, two parts that fit it, and the question that decides between them

Two candidates, both correct on every attribute the line stated, and one of them will not fit the customer's tooling. This is what "close" costs in this category.
Own product, demo data.
Where it stands
Specification-matching capability, on real catalogues, in industrial distribution.
The honest boundary of that claim: matching is what is proven. The intake pipeline that would feed it at volume — email, attachments, forwarded threads — is a demonstrator, and it has not yet run a live order stream at a customer. We would rather write that here than have it surface on the third call.
What it needs to work
Where your item master holds a description string and nothing else, this is a data project first — and a smaller one than you fear. A one-week diagnostic tells you which of the two situations you are in, and it is worth doing before anyone quotes you for matching.
It exists for everything arriving as email, PDF, spreadsheet and free text, which in most distributors we have looked at is the larger half. Orders that come through your portal or over EDI already carry your part numbers and are already matched.
Built for industrial catalogues: tolerances, materials, pressure classes, DIN and ISO families. Consumer and e-commerce catalogues are a different problem. Colour, size and brand are not tolerances, materials and pressure classes, and a system built to match one is not built to match the other.
We apply your substitution rules, consistently, and record why. The decision itself stays yours.
What this proves
Entity resolution against technical specifications in a domain where an approximate answer is a wrong answer, with the governing standard carried through to the result rather than inferred at the end — and the discipline that goes with it: knowing what the system does not know, saying so, and escalating rather than guessing.
Forty-five minutes. Bring two or three real documents — the ones that do not fit the pattern. We will run them on screen and tell you what the work would be.