Разбор по утечке исходников поиска (срез примерно 2022). Делю систему на две половины: робот - это краулинг и индексация (samovar, lemur, jupiter, library, mercury), а search/ - рантайм формирования выдачи. В этом треде интересует ссылочное семейство: как робот честно строит весь ссылочный граф, что он с ним делает дальше, и почему при этом большая часть классических ссылочных факторов в формуле фактически мертва.
1. samovar: экспорт графаКороткий тезис: граф строится полностью и качественно, но отдача с него низкая. Покупка ссылок бьёт по мёртвым слотам И режется классификатором накрутки SeoMark. Дальше - подробно, по компонентам.
Первый узел конвейера - samovar. Именно он материализует ссылочный граф из обхода и отдаёт два экспорта:
Код: Выделить всё
incoming_outgoing_links_export входящие/исходящие ссылки документа
host_link_graph_export ссылочный граф на уровне хостов
Код: Выделить всё
IncomingLinksAggregations
Total всего входящих ссылок
Hosts число уникальных хостов-доноров
Owners число уникальных owner-ов (склеенных групп хостов)
Spam% доля ссылок, помеченных как спамные
TextLenSum суммарная длина анкор-текстов
2. lemur: preparat входящих ссылок и SeoMark
Дальше эстафету берёт lemur. Компонент preparatprocessor собирает агрегированный preparat входящих ссылок - уже с анкор-текстами, привязанными к каждой ссылке. Это вход для классификатора качества.
Сам классификатор живёт в algo/links/seomark.h. Он двухступенчатый:
Код: Выделить всё
SeoMark (algo/links/seomark.h)
MatrixNet 105 фич
CatBoost cb_venality 424 фич
выход: GoodLink / SeoMark
Здесь же в lemur (host/combine, BanDetector) считаются хост-счётчики и тИЦ-подобные агрегаты Cy/Acy.SeoMark не понижает вес плохой ссылки - он её отсекает. Накрученная ссылка не попадает в полезный сигнал. То есть купленная ссылочная масса в значительной части просто не доходит до формулы как положительный фактор.
3. jupiter: Link-Ann и упаковка в индекс
jupiter (links.cpp) строит ссылочные аннотации - Link-Ann. Технически это lerf2 и структура TDocLinkErfInfoProto. На уровне library тем же занимается TLinksMapper, который раскладывает данные в refkeyinv и reflerf. mercury добавляет CanonizedLinkFactors - 18 бакетов канонизированных ссылочных факторов.
Полный конвейер ссылочного семейства выглядит так:
Код: Выделить всё
samovar incoming_outgoing_links_export, host_link_graph
IncomingLinksAggregations (Total/Hosts/Owners/Spam%/TextLenSum)
|
lemur preparatprocessor (preparat + анкоры)
SeoMark: MatrixNet 105 + CatBoost cb_venality 424 -> GoodLink
|
jupiter links.cpp -> lerf2 / TDocLinkErfInfoProto (Link-Ann)
|
library TLinksMapper -> refkeyinv / reflerf
|
mercury CanonizedLinkFactors (18 бакетов)
4. Что мёртвое, а что живое
И вот тут начинается главное. Семейства TG_LINK_GRAPH / LinkBM25 дают 18 из 39 факторов в группе, но из LinkBM25 живы 0 из 9. Картина по конкретным слотам:
Код: Выделить всё
Фактор Слот Статус
FI_PAGE_RANK [0] классический PR в TG_UNUSED
FI_NUM_LINKS [37] живёт (счётчик)
FI_LINK_QUALITY_FIXED [405] живёт (SeoMark)
FI_NEW_LINK_QUALITY_FIXED [407] живёт (SeoMark)
FI_LINK_PAIR [54] dead
FI_LINK_BM25_WEIGHTED_1 [395] dead
LinkBM25 (вся группа) 0/9 dead
Аннотационный слой (Annotation / Xref). Здесь похожая картина: 3 из 133 и 3 из 60 живых. jupiter материализует анкорные и query-to-url аннотации в ann-keyinv через TIndexAnnAggregation, lemur даёт preparat-анкоры, library - annotations/linkannwad, mercury - FastAnnotation, melter - ann/linkann lumps. Но что из этого работает:
Код: Выделить всё
FI_NHOP_TEXT_BCLM_WEIGHTED [666] живёт хопо-текстовый BCLM
FI_NHOP_TEXT_BCLM_PLANE [795] живёт хопо-текстовый BCLM
FI_QU_BM15_WEIGHTED [761] живёт query-to-url
FI_HAS_ALL_WORDS_IN_LINK [82] dead
FI_LR_RELEV [88] dead
XLR* (классические Xref Гулина) dead
5. Зачем тогда вообще строить графСухой остаток по графу: робот строит весь ссылочный граф с анкорами и SeoMark-фильтром. Но LinkBM25 полностью мёртв (0/9), классический PageRank в TG_UNUSED, Xref XLR мёртв. Живёт только аннотационно-браузерный слой - хопы и запросы-к-URL.
Резонный вопрос: если так много мёртвого, зачем робот честно гоняет весь конвейер. Несколько причин.
- GoodLink/SeoMark - это в первую очередь защитный механизм. Чтобы отсечь накрутку, граф всё равно нужно построить целиком, иначе нечего классифицировать.
- Spam% и owner-агрегаты с раннего этапа samovar питают хост- и owner-статику, а не только ссылочные слоты.
- Аннотационный слой (хопы, query-to-url) - живой и опирается ровно на ту же ссылочную инфраструктуру.
- Канонизация (gemini/mirror/superdups) склеивает ссылки и анкоры на один канон, иначе они размазались бы по дублям. Без owner-rollup и склейки зеркал даже живые сигналы дробились бы по http/https/www.
Что из этого следует практически:Покупка ссылок попадает в двойную ловушку. Во-первых, бьёт по мёртвым слотам - LinkBM25 0/9, классический PageRank в TG_UNUSED, XLR мёртв, то есть прямого ссылочного веса в формуле почти нет. Во-вторых, режется SeoMark (MatrixNet 105 + CatBoost cb_venality 424), который не понижает, а отсекает накрученные ссылки ещё на индексации. Это бьёт дважды.
- Разнообразие доноров по Owners важнее объёма по Total - робот их разводит на уровне агрегации samovar.
- Высокий Spam% в профиле фиксируется рано и портит ссылочную метку через SeoMark.
- Реально полезен живой слой - переходы (query-to-url, FI_QU_BM15_WEIGHTED) и хопо-текстовые аннотации (FI_NHOP_TEXT_BCLM_*). Это ближе к трафику и поведению, чем к голой ссылочной массе.
Дисклеймер: срез примерно 2022, имена компонентов, факторов и пороги могли смениться. Конкретные веса иллюстративны - реальные обучаемы и проприетарны. Статусы live/dead - по состоянию слотов в формуле на момент среза.