Когда сеошник говорит "позиция документа", он чаще всего имеет в виду результат работы формулы ранжирования. Утечка исходников показывает, что это лишь половина картины. Поверх скоринга, на уровне верхнего метапоиска (то, что в коде называется upper search), сидит отдельный фреймворк правил - rearrange. Он берёт уже посчитанную и слитую выдачу и переписывает её: переставляет, склеивает дубли, режет хосты, бустит свежее, пессимизирует спам, выкидывает забаненное. Каталогов правил в web/rearrange/ ровно 380. Именно этот слой формирует то, что пользователь реально видит в топе - и именно поэтому он критичен для SEO не меньше, чем сама формула.
Срез данных - примерно 2022 год. Имена правил, пороги и веса с тех пор могли поменяться; приведённые формулы иллюстративны, реальные коэффициенты обучаемы и проприетарны.Скоринг считает "насколько документ хорош". Rearrange решает "что из хорошего показать и в каком порядке". Видимый топ - это выход 380 правил, наложенных поверх релевантности.
Фреймворк: как устроено правило
Каждое правило rearrange регистрируется одним макросом и наследует общий контекст. Дальше движок прогоняет правило в одной из фаз конвейера.
Код: Выделить всё
Регистрация правила:
REGISTER_REARRANGE_RULE(name, creator) web/core/rule.h:21
наследует IRearrangeRuleContext web/core/rule.h:27
Фазы исполнения (web/core/rule_factory.h:42):
RRP_AFTER_SEARCH после поиска по шардам
RRP_AFTER_MERGE после слияния шардов в единую выдачу <-- главная для SEO
RRP_BEFORE_FETCH до подтяжки тел документов
RRP_AFTER_FETCH после подтяжки (снова доступны дубли/тексты)
+ AFTER_META_FEATURES / RANK, ENRICH_DOCS
Главный хук: DoRearrangeAfterMerge web/core/rule.h:98
Каждое правило управляемо извне через cgi-параметры: выключить - &rearr=Name_off (или all_off для всех), включить отладку - &rearr=Name_dbg=1. Это даёт инструмент изоляции: можно посмотреть, как менялась бы выдача без конкретного правила.
SEO-критичные правила AfterMerge
Ниже - разбор правил, существование каталогов которых подтверждено в web/rearrange/. Это не весь список из 380, а та его часть, которая прямо двигает коммерческий и информационный топ.
Код: Выделить всё
ПРАВИЛО КАТАЛОГ web/rearrange/ ЧТО ДЕЛАЕТ С ВЫДАЧЕЙ
----------------- --------------------- --------------------------------------
AntiSeoResetFactors antiseo_reset_factors/ Обнуляет блок ссылочных/SEO-факторов
для коммерч. RU-запросов через
pron=disablefactorsgroup:...
Antispam antispam/ ML-классификатор спама (SpamFormulaId),
пессимизация скора; может слать в бан
AntiDup antidup/ Удаление/склейка дублей URL,
пессимизация клонов; работает дважды
FilterBanned filterbanned/ (+video/, Жёсткое удаление доков из бан-листа
imgban/)
Fresh / FreshBoost fresh/, fresh_boost/, Детект свежих по _DateSource,
FreshFilterMiddle ... группа d_fresh, буст новизны
UnGroupVital ungroup_vital/ Разгруппировка ради разнообразия,
доки с разных хостов, гео-фильтр
HostPresence / host_presence/, Лимит числа доков одного хоста в
HostClassifier hostclassifier/ топе; классификация хостов по типу
Trash / NarcoPess / trash/, narco_pess/, Понижение мусора, тематические и
Porno / Family porno/, family_filter/ возрастные фильтры
Authority / authority_boost/, Повышение авторитетных источников,
AdditiveBoost additive_boost/ суммирование бустов
ITDITP* itditp_diversity_exp.../ Разнообразие и персонализация
itditp_antidup/, выдачи (эксперименты)
itditp_personalization/
Antispam - не бинарный фильтр, а ML-классификатор с обучаемой формулой (SpamFormulaId). Документ получает spamRating, а итоговая пессимизация считается линейно.
Код: Выделить всё
penalty = -(PessFactor * spamRating + PessSummand)
config.cpp:34 antispam.cpp:30
AntiDup закрывает классику: региональные клоны магазинов, репосты, карточки одного товара в каталоге. Важная деталь - правило работает дважды, в AfterMerge и снова в AfterFetch, когда подтянуты тела и сравнение точнее. Вместо удаления клон часто пессимизируется, то есть остаётся в индексе, но опускается.
UnGroupVital и HostPresence/HostClassifier - это разнообразие выдачи. Первое разгруппировывает результаты, вытягивая документы с разных хостов и применяя гео-фильтр; вторые ограничивают, сколько страниц одного хоста допустимо в топе, и классифицируют хосты по типу. Для SEO это потолок: даже идеально релевантный сайт не займёт топ целиком.
Fresh/FreshBoost детектят свежесть по _DateSource, формируют отдельную группу d_fresh и бустят новизну - механика, поднимающая новости и свежие посты. Trash/NarcoPess/Porno/Family - тематические и возрастные понижения; типичная форма пессимизации здесь:
Код: Выделить всё
SetRelevance(rel - pess * SCALE)
Document filtering: почему документ выпал
Отдельный механизм инструментирует причины, по которым документ не дошёл до выдачи. Это enum состояний фильтрации - около 30 причин.
Код: Выделить всё
enum EFilteringState document_filtering/document_filtering.h:22
PASSED прошёл
FILTERED_BY_PRUNING отсечён прунингом (ранний обрез)
FILTERED_BY_QUORUM не набрал кворум по словам запроса
FILTERED_BY_ANTISPAM зарезан антиспамом
FILTERED_BY_DYNAMIC_ANTISPAM похоже на sandbox / временный бан
FILTERED_BY_PORNO порно-фильтр
FILTERED_BY_EMBEDDING_STORAGE_DOT_PRODUCT_TOP отсев по близости эмбеддингов
... (~30 состояний всего)
Вывод
Для SEO из этого следует прямой вывод: оптимизировать только под скоринг недостаточно. Сайт может быть релевантным по формуле и при этом упираться в HostPresence (лимит на хост), терять ссылочный вес на AntiSeoResetFactors, склеиваться в AntiDup или пессимизироваться Antispam. Реальная работа идёт против двух слоёв сразу - ранжирующего и переранжирующего, причём второй переписывает результат первого последним. Ещё раз дисклеймер: срез примерно 2022 года, конкретные имена правил, пороги и веса могли смениться, формулы здесь иллюстративны.Формула ранжирования - необходимое, но не достаточное условие топа. Поверх неё 380 правил rearrange решают, что выживет в видимой выдаче. AfterMerge - главная фаза: именно там правятся дубли, хосты, свежесть, спам и SEO-факторы уже на слитом списке.