[{"data":1,"prerenderedAt":170},["ShallowReactive",2],{"post-014-matchpro-engine-ru":3,"post-og-014-matchpro-engine":97},{"id":4,"title":5,"bars":6,"blurb":7,"body":8,"color":6,"contacts":6,"date":81,"dateModified":6,"description":82,"extension":83,"featured":84,"groups":6,"kicker":85,"meta":86,"metrics":6,"n":87,"navigation":84,"openTabs":6,"path":88,"progress":6,"readTime":89,"reading":6,"role":6,"rules":6,"running":6,"seo":90,"ships":6,"slug":91,"stack":6,"started":6,"status":6,"stem":92,"streak":6,"tag":93,"tagColor":95,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":96},"ru\u002Fwriting\u002F014-matchpro-engine.md","Как я переписывал матчинговый движок matchpro",null,"Что я понял, три недели наблюдая за кликами рекрутеров.",{"type":9,"value":10,"toc":75},"minimark",[11,15,19,24,27,30,40,69,72],[12,13,14],"p",{},"▸ в центре · кейс — № 014 · 18 апр '26 · 8 мин",[16,17,5],"h2",{"id":18},"как-я-переписывал-матчинговый-движок-matchpro",[12,20,21],{},[22,23,7],"em",{},[25,26],"hr",{},[12,28,29],{},"три года matchpro матчил кандидатов с вакансиями по-ленивому — tf-idf по заголовкам с щепоткой правил. было нормально. не отлично. рекрутеры продолжали присылать мне скриншоты очевидных матчей, которые движок не находил. этой весной я сел и переписал всё целиком.",[31,32,33],"blockquote",{},[12,34,35,36,39],{},"«матчинг — это не поиск. поиск вознаграждает точность. матчинг вознаграждает ",[22,37,38],{},"интересную близость",".»",[41,42,43,51,57,63],"ol",{},[44,45,46,50],"li",{},[47,48,49],"strong",{},"выкинуть ранкер"," — данные оставил, модель удалил. начал с пустого ipynb.",[44,52,53,56],{},[47,54,55],{},"эмбеддить всё"," — резюме + текст вакансии → небольшая мультиязычная модель, кэш в pg_vector.",[44,58,59,62],{},[47,60,61],{},"пере-ранжировать по сигналам"," — локация, сениорити, годы в стеке. скучные фичи всё ещё побеждают.",[44,64,65,68],{},[47,66,67],{},"тень-прогон 3 недели"," — a\u002Fb по кликам рекрутеров. смотрел на дашборды больше, чем на семью.",[12,70,71],{},"цифры через 11 недель: качество матча 41% → 78%, время до первого клика 9.2с → 3.1с, трудоустройств в неделю 12 → 28, p95 latency 640мс → 180мс.",[12,73,74],{},"полный разбор — в \u002Fwork\u002Fmatchpro.",{"title":76,"searchDepth":77,"depth":78,"links":79},"",2,3,[80],{"id":18,"depth":77,"text":5},"2026-04-18","Как я переписывал матчинговый движок matchpro — что я понял, три недели наблюдая за кликами рекрутеров.","md",true,"кейс",{},"014","\u002Fwriting\u002F014-matchpro-engine","8 мин",{"title":5,"description":82},"014-matchpro-engine","writing\u002F014-matchpro-engine",{"label":94,"color":95},"длинный текст","var(--red)","Y1a_qRsAGhXruSGRgEhmMmNqiGbKNSA3DLxb_8ebrrs",{"id":98,"title":99,"bars":6,"blurb":100,"body":101,"color":6,"contacts":6,"date":81,"dateModified":6,"description":162,"extension":83,"featured":84,"groups":6,"kicker":163,"meta":164,"metrics":6,"n":87,"navigation":84,"openTabs":6,"path":88,"progress":6,"readTime":165,"reading":6,"role":6,"rules":6,"running":6,"seo":166,"ships":6,"slug":91,"stack":6,"started":6,"status":6,"stem":92,"streak":6,"tag":167,"tagColor":95,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":169},"en\u002Fwriting\u002F014-matchpro-engine.md","Rewriting matchpro's matching engine","What I learned from watching recruiters click for three weeks.",{"type":9,"value":102,"toc":159},[103,106,109,113,115,118,127,153,156],[12,104,105],{},"▸ featured · case study — № 014 · apr 18 '26 · 8 min",[16,107,99],{"id":108},"rewriting-matchpros-matching-engine",[12,110,111],{},[22,112,100],{},[25,114],{},[12,116,117],{},"for three years matchpro matched candidates to jobs the lazy way — a tf-idf over titles, with a sprinkle of rules. it was fine. not great. recruiters kept emailing me screenshots of obvious matches it missed. so this spring i sat down and rebuilt the whole thing.",[31,119,120],{},[12,121,122,123,126],{},"\"matching is not search. search rewards precision. matching rewards being ",[22,124,125],{},"interestingly close",".\"",[41,128,129,135,141,147],{},[44,130,131,134],{},[47,132,133],{},"throw away the ranker"," — kept the data, dropped the model. started from a blank ipynb.",[44,136,137,140],{},[47,138,139],{},"embed everything"," — résumé + job text → small multilingual model, cached in pg_vector.",[44,142,143,146],{},[47,144,145],{},"re-rank with signals"," — location, seniority, years-in-stack. boring features still win.",[44,148,149,152],{},[47,150,151],{},"shadow-run for 3 weeks"," — a\u002Fb on recruiters' clicks. watched dashboards more than family.",[12,154,155],{},"the numbers after 11 weeks: match-quality 41% → 78%, time-to-first-click 9.2s → 3.1s, weekly placements 12 → 28, p95 latency 640ms → 180ms.",[12,157,158],{},"read the full postmortem on \u002Fwork\u002Fmatchpro.",{"title":76,"searchDepth":77,"depth":78,"links":160},[161],{"id":108,"depth":77,"text":99},"Rewriting matchpro's matching engine — what I learned from watching recruiters click for three weeks.","case study",{},"8 min",{"title":99,"description":162},{"label":168,"color":95},"long read","zKM9k3xbKEs_rywRELI7EKj4Y_-0H1SfQ1_9haVJdH8",1777071044093]