[{"data":1,"prerenderedAt":224},["ShallowReactive",2],{"post-016-matching-meaning-en":3,"post-og-016-matching-meaning":146},{"id":4,"title":5,"bars":6,"blurb":7,"body":8,"color":6,"contacts":6,"date":130,"dateModified":6,"description":131,"extension":132,"featured":133,"groups":6,"kicker":134,"meta":135,"metrics":6,"n":136,"navigation":137,"openTabs":6,"path":138,"progress":6,"readTime":139,"reading":6,"role":6,"rules":6,"running":6,"seo":140,"ships":6,"slug":141,"stack":6,"started":6,"status":6,"stem":142,"streak":6,"tag":143,"tagColor":144,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":145},"en\u002Fwriting\u002F016-matching-meaning.md","Matching is not search: from keywords to meaning",null,"why a job marketplace threw out keyword matching — and what it kept.",{"type":9,"value":10,"toc":117},"minimark",[11,15,19,24,27,30,40,48,53,56,63,67,74,77,81,84,87,91,94,98,101,105,112],[12,13,14],"p",{},"▸ case study — № 016 · jun 13 '26 · 6 min",[16,17,5],"h2",{"id":18},"matching-is-not-search-from-keywords-to-meaning",[12,20,21],{},[22,23,7],"em",{},[25,26],"hr",{},[12,28,29],{},"matchpro is a job marketplace, and it runs on one stubborn opinion:",[31,32,33],"blockquote",{},[12,34,35,36,39],{},"\"matching is not search. search rewards precision. matching rewards being ",[22,37,38],{},"interestingly close",".\"",[12,41,42,43,47],{},"a search engine is judged on exactness — you typed ",[44,45,46],"code",{},"postgres",", you want the rows that say postgres. matching is the opposite game. the best role for a person is often the one they'd never have typed into a search box, and the best candidate for a role is often the one who described the same work in different words. optimize matching like search and you get a system that's confidently, precisely wrong.",[49,50,52],"h3",{"id":51},"the-keyword-era","the keyword era",[12,54,55],{},"for years the matching leaned on exact rules: keyword and title overlap, plus a handful of hard filters. it's the obvious first version, and it isn't even bad — while everyone shares a vocabulary. in one tight field, in one language, people converge on the same words, and word-overlap is a decent proxy for fit.",[12,57,58,59,62],{},"it gets brittle the moment you leave that world. two people describe identical work in different terms and never meet. a strong candidate uses last year's job title. someone writes in another language entirely. the keyword engine doesn't see a weak match — it sees ",[22,60,61],{},"no"," match. and the fix — a growing table of synonyms and aliases, hand-fed per field — rots faster than you can maintain it.",[49,64,66],{"id":65},"from-rules-to-meaning","from rules to meaning",[12,68,69,70,73],{},"the rewrite was one idea: compare a profile and a role by what they ",[22,71,72],{},"mean",", not which words they happen to share. represent the meaning of each side, and let \"close in meaning\" do the recall that word-overlap couldn't. suddenly the interestingly-close matches — the ones a recruiter recognizes instantly but the search box hid — surface on their own.",[12,75,76],{},"this is the part that reads like magic in a demo and humbles you in production. meaning-based recall is generous; it finds a lot. which is exactly why it can't be the whole system.",[49,78,80],{"id":79},"keep-the-boring-rules","keep the boring rules",[12,82,83],{},"meaning finds candidates. it does not get to decide who actually qualifies. some things aren't fuzzy — a hard requirement is a hard requirement, and \"interestingly close\" is the wrong answer when someone simply can't take the role. so the hard constraints stayed, as a gate the meaning-matches have to pass through.",[12,85,86],{},"the lesson i keep relearning: the exciting layer (learned similarity) and the boring layer (explicit rules) aren't rivals. the boring one earns its keep. throw it away and your clever matcher confidently recommends impossible things.",[49,88,90],{"id":89},"meaning-travels","meaning travels",[12,92,93],{},"the quiet payoff: meaning isn't tied to a vocabulary, so the same approach reaches past the field and the language it was born in. a profile written in one language can match a role written in another, without a translation table per pair. you stop maintaining brittle per-field dictionaries and start trusting a representation that generalizes.",[49,95,97],{"id":96},"privacy-is-part-of-the-match","privacy is part of the match",[12,99,100],{},"one more constraint shaped all of it: people are matched while anonymous. the system works over profiles stripped of identity, and who-you-are is revealed only when both sides agree to talk. that's a product stance, but it's an engineering one too — it decides what the matcher is even allowed to see, and it keeps the incentives honest. you match on substance because, for a while, substance is all there is.",[49,102,104],{"id":103},"the-takeaway","the takeaway",[12,106,107,108,111],{},"compress the whole rewrite into one line: ",[22,109,110],{},"match by meaning, decide by rules, reveal by consent."," matching by meaning gets the headlines; the boring gate and the privacy stance are what make it usable. matching is not search — and the day you stop optimizing it like search is the day it starts to feel like it understands.",[12,113,114],{},[22,115,116],{},"matchpro.io is a privacy-first job marketplace. this is the approach, not the recipe — the interesting parts stay in the repo.",{"title":118,"searchDepth":119,"depth":120,"links":121},"",2,3,[122],{"id":18,"depth":119,"text":5,"children":123},[124,125,126,127,128,129],{"id":51,"depth":120,"text":52},{"id":65,"depth":120,"text":66},{"id":79,"depth":120,"text":80},{"id":89,"depth":120,"text":90},{"id":96,"depth":120,"text":97},{"id":103,"depth":120,"text":104},"2026-06-13","matchpro case study: why the matching moved from keywords to meaning — and which 'boring' parts had to stay.","md",false,"case study",{},"016",true,"\u002Fwriting\u002F016-matching-meaning","6 min",{"title":5,"description":131},"016-matching-meaning","writing\u002F016-matching-meaning",{"label":134,"color":144},"var(--red)","j-r-kuyCke1c92YkTo6Maq4Sf3DWRzKvAzzhufUTU0Y",{"id":4,"title":5,"bars":6,"blurb":7,"body":147,"color":6,"contacts":6,"date":130,"dateModified":6,"description":131,"extension":132,"featured":133,"groups":6,"kicker":134,"meta":221,"metrics":6,"n":136,"navigation":137,"openTabs":6,"path":138,"progress":6,"readTime":139,"reading":6,"role":6,"rules":6,"running":6,"seo":222,"ships":6,"slug":141,"stack":6,"started":6,"status":6,"stem":142,"streak":6,"tag":223,"tagColor":144,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":145},{"type":9,"value":148,"toc":211},[149,151,153,157,159,161,167,171,173,175,179,181,185,187,189,191,193,195,197,199,201,203,207],[12,150,14],{},[16,152,5],{"id":18},[12,154,155],{},[22,156,7],{},[25,158],{},[12,160,29],{},[31,162,163],{},[12,164,35,165,39],{},[22,166,38],{},[12,168,42,169,47],{},[44,170,46],{},[49,172,52],{"id":51},[12,174,55],{},[12,176,58,177,62],{},[22,178,61],{},[49,180,66],{"id":65},[12,182,69,183,73],{},[22,184,72],{},[12,186,76],{},[49,188,80],{"id":79},[12,190,83],{},[12,192,86],{},[49,194,90],{"id":89},[12,196,93],{},[49,198,97],{"id":96},[12,200,100],{},[49,202,104],{"id":103},[12,204,107,205,111],{},[22,206,110],{},[12,208,209],{},[22,210,116],{},{"title":118,"searchDepth":119,"depth":120,"links":212},[213],{"id":18,"depth":119,"text":5,"children":214},[215,216,217,218,219,220],{"id":51,"depth":120,"text":52},{"id":65,"depth":120,"text":66},{"id":79,"depth":120,"text":80},{"id":89,"depth":120,"text":90},{"id":96,"depth":120,"text":97},{"id":103,"depth":120,"text":104},{},{"title":5,"description":131},{"label":134,"color":144},1781358081772]