Tout sur les fuites de l’API de Google Search : une mine d’informations pour les SEO

La documentation interne de l’API Content Warehouse de Google Search a fait l’objet d’une fuite, la version obsolète a été publié publiquement dans un dépôt de code (GitHub pour être plus précis), puis sauvegardé en externe…

Leak Google Api Content Warehouse

Est-ce volontaire pour détourner l’attention d’AI Overviews qui déchaine les passions et les reproches au combien justifiés ou un réel leak ?
mangeur de pierre AI Google

Fuite de la documentation interne de Google Search

La fuite de la documentation interne de l’API Content Warehouse de Google Search révèle des informations précieuses sur le fonctionnement de l’algorithme que j’ai essayé de traduire et synthétisé. J’ai fait une sélection et pas tout traduit, si j’ai raté quelque chose ou mal interprété un document, n’hésitez surtout pas à commenter l’article ou à me contacter.

Des informations techniques

J’ai examiné les documents de référence de l’API, les contextualisant avec d’autres fuites antérieures de Google et des témoignages antitrust.

Bien que la documentation ne détaille pas les fonctions de scoring de Google, elle permet de comprendre ce qu’utilise Google et de valider certaines informations, tout en gardant en tête que cela provient d’une version obsolète (la date la plus récente est en août 2023).

2024 API Content Warehouse

Mais cela reste du contenu frais et intéressant.

2023 API Content Warehouse

Ces informations sont cruciales, mais il serait inexact de les qualifier toutes de « facteurs de classement », surtout que certaines concernent YouTube, d’autres Maps… il faut donc bien faire attention à attribuer chaque attribue au bon service.

Cela permet encore une fois de faire la différence entre la communication de Google et la réalité technique, ce que l’on sait depuis des années du côté des éditeurs de sites et SEO.

Des dizaines de milliers de fonctionnalités de classement listées

Les documents divulgués révèlent la présence des milliers de modules dans la documentation de l’API, avec les attributs associés. Chaque module est détaillé avec des résumés, des types, des fonctions et des attributs.

Google Api Content Warehouse

La majorité des informations se concentre sur les définitions des propriétés de divers protocoles de communication utilisés à travers les systèmes de classement pour générer les pages de résultats de recherche.

Malheureusement, de nombreux résumés renvoient à des liens internes sur l’intranet de Google, fournissant des détails supplémentaires sur différents aspects du système.

Petit point sur l’indexation

Nous avons quelques soucis pour indexer nos pages dernièrement, bien que cela semble moins compliqué dernièrement et cela tombe bien, car on retrouve des informations à ce sujet dans la documentation. Pour faire simple : un site puissant, avec des impressions, des clics, des visites sera priorisé.

pagerankScore (type: GoogleApi.ContentWarehouse.V1.Model.IndexingSignalAggregatorAggregatedScore.t, default: nil) - Score de PageRank. Cet attribut contient le score agrégé de PageRank utilisé pour évaluer l’autorité et la pertinence d’un document.

patternScore (type: GoogleApi.ContentWarehouse.V1.Model.IndexingSignalAggregatorAggregatedScore.t, default: nil) - Score de modèle. Cet attribut contient le score agrégé basé sur les modèles d’URL pour évaluer la qualité et la pertinence d’un document.

priorSignal (type: list(GoogleApi.ContentWarehouse.V1.Model.IndexingSignalAggregatorUrlPatternSignalsPriorSignal.t), default: nil) - Signal antérieur. Une liste de signaux antérieurs utilisés dans le scoring, fournissant des informations historiques pour l’évaluation de l’URL.

targetSite (type: String.t, default: nil) - Ciblage au niveau du site. Cet attribut indique le site au niveau de l’hôte pour le regroupement des documents.

Spam et YMYL

Cette section de la documentation décrit des attributs spécifiques utilisés pour évaluer et classer les documents en fonction des scores YMYL (Your Money or Your Life) et des données de SpamBrain. Pour résumer, Google va attribuer une note de 0 à 127 concernant le spam et une note (à priori de de -2147483648 à +2147483647) YMYL (santé & news).

Il y a donc toute une nuance de spam et de notation YMYL, ce n’est pas aussi manichéen ou booléen que je le pensais. Mais ces sites sont clairement identifiés.

spamrank (type: integer(), default: nil) - Échelle uint16. Cet attribut indique le score de spam attribué au document, sur une échelle de type uint16.

spamscore1 (type: integer(), default: nil) - Obsolète, à supprimer après le 20 octobre. Échelle de 0 à 127. Cet attribut, bien que bientôt obsolète, mesure le score de spam du document sur une échelle de 0 à 127.

spamscore2 (type: integer(), default: nil) - Échelle de 0 à 127. Cet attribut mesure le score de spam du document sur une échelle de 0 à 127.

spambrainData (type: GoogleApi.ContentWarehouse.V1.Model.SpamBrainData.t, default: nil) - Données au niveau du segment de site Host-v1 provenant de SpamBrain. Cet attribut contient des scores de SpamBrain, un système utilisé pour détecter et évaluer le spam au niveau des sites.

type (type: String.t, default: nil) - Type de ce segment. Par exemple, ymyl_health, d2v, etc. Cet attribut indique le type de segment du document, fournissant des informations contextuelles sur sa catégorie ou sa classification.

siteAutopilotScore (type: number(), default: nil) - Score d’autopilote du site. Valeur agrégée des scores d’autopilote d’URL pour ce segment de site. Cet attribut mesure la performance globale du site en termes de score d’autopilote, aidant à évaluer l’efficacité et l’automatisation du site.

ymylHealthScore (type: integer(), default: nil) - Stocke les scores du classificateur de santé YMYL comme défini à go/ymyl-classifier-dd. Pour utiliser ce champ, vous devez rejoindre le groupe g/pq-classifiers-announce et ajouter votre cas d’utilisation. Cet attribut enregistre le score de santé pour les contenus liés à la santé, évaluant leur pertinence et leur fiabilité.

ymylNewsScore (type: integer(), default: nil) - Stocke les scores du classificateur de nouvelles YMYL comme défini à go/ymyl-classifier-dd. Pour utiliser ce champ, vous devez rejoindre le groupe g/pq-classifiers-announce et ajouter votre cas d’utilisation. Cet attribut enregistre le score de fiabilité pour les contenus d’actualité, évaluant leur pertinence et leur qualité selon les critères YMYL.

Il y a également des gardes-fous comme :

isValidResult (type: boolean(), default: nil) - Suppose que ce champ est vrai sauf si nous découvrons que le résultat ne correspond pas à la requête, auquel cas ce résultat est invalide malgré le fait d’avoir retourné des informations sur le document.

expired (type: boolean(), default: nil) - Vrai si et seulement si le domaine est expiré.

Nouveauté : thématisation & whitelist

Pour la première pas vraiment, mais il est parfois difficile de classer toutes les informations, par contre la thématisation pourrait être un point fort, même si la réalité dans les SERPs n’est pas toujours au rendez-vous. Nous n’avons pas accès à la pondération des critères, il y a fort à parier que l’usage et la popularité surpasse une thématisation.

Boost SEO pour un site thématisé

Nous nous doutions qu’il y avait un classement des sites par thématique sur Google Discover, nous en avons maintenant la preuve :

browsyTopic (type: GoogleApi.ContentWarehouse.V1.Model.RepositoryWebrefCategoryAnnotationBrowsyTopic.t, default: nil) - Scores expérimentaux utilisés par Discover. Cet attribut fournit des annotations de catégorie pour les documents et les requêtes, aidant à classer le contenu dans des catégories spécifiques.

Côté Search, un siteFocusScore élevé pourrait aider à mettre en avant des sites experts dans des sujets spécifiques, tandis que le smallPersonalSite valoriserait les petits blogs, ajoutant diversité et perspectives personnelles aux SERP, mais en les classant comme tel (red flag ?). Le boostFactor favorise les sites de haute qualité, optimisant l’expérience utilisateur par des contenus fiables et bien conçus.

Enfin, gobiSite distingue les sites importants pour des requêtes spécifiques, mais en isolant le site sur d’autres thématiques (même si dans les faits nous ne l’observons pas dans les résultats). Ce critère doit bien fonctionner pour la mise en avant, mais doit être mineur ou vraiment moins important que d’autres critères.

siteFocusScore (type: number(), default: nil) - Nombre indiquant à quel point un site est concentré sur un seul sujet. Cet attribut, stocké dans des shards et copié dans superroot, mesure la spécialisation d’un site dans un domaine particulier. Il est dérivé des TopicEmbeddings et indique le degré de focalisation d’un site sur une thématique spécifique. Plus le score est élevé, plus le site est considéré comme spécialisé et pertinent pour ce sujet.

smallPersonalSite (type : number(), valeur par défaut : nil) - Score de promotion des petits sites personnels [lien vers go/promoting-personal-blogs-v1].

boostFactor (type : number(), valeur par défaut : nil) - Multiplicateur d’amélioration du site.

gobiSite (type : boolean(), valeur par défaut : nil) - Indique si le site appartient à un domaine gobi, c’est-à-dire un domaine qui devrait être privilégié pour une requête de catégorie incluant ce domaine gobi. Par exemple, amazon.com est un domaine de magasin gobi pour la requête de catégorie [hdtv], mais certains sites (comme askville.amazon.com) issus de amazon.com ne devraient pas être privilégiés.

Système de whitelist

Autre surprise, le système de liste blanche utilisé pendant la crise du COVID-19 et durant les élections :

isCovidLocalAuthority (type: boolean(), default: nil) - Indicateur pour déterminer si le site possède le signal d’autorité locale Covid, tel que calculé par go/covid-local-authority.

isElectionAuthority (type: boolean(), default: nil) - Indicateur pour déterminer si le site possède le signal d’autorité électorale, tel que calculé par go/election-authority.

Informations validées

Google utilise les données récupérées par Chrome, les probabilités d’usage et la popularité. On retrouve donc les informations de Navboost, du PageRank et l’usage utilisateurs.

qualitysignals (type: GoogleApi.ContentWarehouse.V1.Model.CompositeDocQualitySignals.t, default: nil) - Signaux de qualité. Cet attribut contient divers signaux de qualité associés au document, utilisés pour évaluer sa pertinence et sa valeur.

scamness (type: integer(), default: nil) - Score du modèle de scam. Utilisé comme l’un des signaux de qualité de page qstar. Plage de valeurs de 0 à 1023.

unauthoritativeScore (type: integer(), default: nil) - Score d’inauthenticité. Utilisé comme l’un des signaux de qualité de page qstar.

sitemap (type: GoogleApi.ContentWarehouse.V1.Model.Sitemap.t, default: nil) - Sitelinks : Une collection de liens intéressants qu’un utilisateur pourrait vouloir consulter, étant donné qu’il s’intéresse à ce document. Attention : ceci est différent des sitemaps pour les crawlers (voir SitemapsSignals dans les pièces jointes).

healthScore (type: number(), default: nil) - Signaux catégoriels. Cet attribut mesure la qualité de santé globale d’un site, en fonction de divers signaux catégoriels.

clutterScore (type: number(), default: nil) - Signal delta au niveau du site dans Q* pénalisant les sites avec un grand nombre de ressources distrayantes/ennuyeuses chargées par le site (voir go/clutter-v0). Cet attribut pénalise les sites qui chargent des ressources perturbatrices, affectant négativement l’expérience utilisateur.

Usage utilisateur

Google utilise divers attributs pour évaluer les interactions des utilisateurs pour classer les documents dans son moteur. Les interactions dans Chrome, sur le moteur de recherche (impression, clics), mais aussi l’utilisation des données d’utilisateurs spécifiques permettent à Google d’évaluer la popularité et la pertinence de ses documents via les clics et les visites sur les pages, mais également au global sur le site.

chromeWeight (type: number(), default: nil) - Poids attribué par Chrome. Cet attribut indique le poids ou l’importance d’un document en fonction des interactions dans Chrome.

navboostScore (type: number(), default: nil) - Score de boost de navigation. Un score qui reflète l’amélioration de la navigation grâce au document.

navmenuScore (type: number(), default: nil) - Score de menu de navigation. Un nombre indiquant l’efficacité du document à améliorer les menus de navigation.

impressions (type: String.t, default: nil) - Nombre d’impressions. Cet attribut enregistre combien de fois le document a été affiché aux utilisateurs.

unsquashedImpressions (type: float(), default: nil) - Ce champ n’est pas encore peuplé dans le format actuel. Deux instances de CrapsClickSignals (compressées/non compressées) sont utilisées à la place. Nous migrons vers le nouveau format où ce champ sera peuplé.

clicks (type: float(), default: nil) - Nombre total de clics. Cet attribut enregistre le nombre total de clics reçus par un document ou un lien.

goodClicks (type: float(), default: nil) - Nombre de bons clics. Cet attribut enregistre le nombre de clics jugés pertinents ou de haute qualité.

badClicks (type: float(), default: nil) - Nombre de mauvais clics. Cet attribut enregistre le nombre de clics jugés non pertinents ou de faible qualité.

unicornClicks (type: float(), default: nil) - Nombre de clics associés à un événement provenant d’un utilisateur Unicorn. Cet attribut enregistre un sous-ensemble de clics spécifiques à des utilisateurs identifiés comme Unicorn.

unsquashedClicks (type: float(), default: nil) - Ce champ n’est pas encore peuplé dans le format actuel. Deux instances de CrapsClickSignals (compressées/non compressées) sont utilisées à la place. Nous migrons vers le nouveau format où ce champ sera peuplé.

longClicks (type: String.t, default: nil) - Nombre de clics longs. Cet attribut compte les clics prolongés effectués par les utilisateurs sur le document.

totalClicks (type: number(), default: nil) - Le nombre total de clics sur ce document, tiré des données Navboost. Cet attribut mesure combien de fois un document a été cliqué dans les résultats de recherche, indiquant son niveau d’engagement ou de popularité parmi les utilisateurs.

recentLongCtr (type: number(), default: nil) - Taux de clics longs récent. Un nombre indiquant le taux de clics longs sur une période récente.

longCtr (type: number(), default: nil) - Taux de clics longs (CTR). Un nombre représentant le taux de clics longs par rapport aux impressions.

Et ma préférée :

chromeInTotal (type : number(), par défaut : nil) – Vues Chrome au niveau du site.

Autorité (pour les fadas de l’E-E-A-T)

Du site

La documentation liste plusieurs attributs clés utilisés pour évaluer l’autorité des sites, un critère pour leur classement dans les résultats de recherche. L’attribut siteAuthority converti de quality_nsr.SiteAuthority et appliqué dans Qstar, mesure l’autorité globale d’un site, influençant directement sa visibilité.

De plus, l’attribut authorityPromotion, dérivé de QualityBoost.authority.boost, indique une promotion de l’autorité, renforçant encore le positionnement du site. Ces mesures d’autorité sont complétées par des attributs tels que babyPandaV2Demotion et productReviewPUhqPage évaluent la qualité des pages et des avis de produits.

L’attribut isPublisher indique si l’entité est l’éditeur de la page, par exemple, CNN pour une URL donnée. Le relevanceScore est un score de pertinence généré par un classificateur d’entités basé sur le machine learning, similaire à la topicalité, mais spécifiquement basé sur le machine learning.

De l’auteur

isAuthor (type: boolean(), default: nil) - Vrai si l’entité est l’auteur du document. Cet attribut est principalement développé et ajusté pour les articles de presse (par exemple, /m/02x27qn sur « www.vogue.com/article/flint-town-netflix ») mais est également utilisé pour d’autres contenus (par exemple, des articles scientifiques).

Mais globalement, les informations que l’on trouve sont peu nombreuses, ce qui confirmerait ce que je répète en boucle, l’E-E-A-T n’est pas un critère, en tout cas pas comme certains le décrivent.

Nom de domaine

Comme nous l’avons vu précédemment, Google surveille si le domaine est expiré ou non, mais il va bien plus loin que cela avec l’attribut createdDate (nombre de jours depuis le 1er janvier 1995 que ce domaine a été créé pour la dernière fois) et pourrait surveiller son historique.

Google va surveiller l’âge d’un domaine plus spécifiquement pour tenter de repérer du spam via un domaine expiré remonté, mais aussi limité la puissance des EMD :

hostAge (type: integer(), default: nil) - Date de première vue la plus ancienne de toutes les pages de cet hôte/domaine. Ces données sont utilisées dans twiddler (le crawler de Google, nous y reviendrons) pour mettre en quarantaine les spams récents au moment de la diffusion.

exactMatchDomainDemotion (type: integer(), default: nil) - Signaux de qualité de page convertis à partir des champs du proto QualityBoost dans quality/q2/proto/quality-boost.proto. Pour économiser de l’espace d’indexation, les valeurs flottantes dans l’intervalle [0, 1] sont converties en entiers dans l’intervalle [0, 1023] (utilisation de 10 bits). exact_match_domain_demotion : converti de QualityBoost.emd.boost.

Popularité

Les liens et les ancres répertoriées dans un document, ainsi que le suivi de leur création et suppression, jouent un rôle clé pour Google. La qualité et l’importance des pages source sont évaluées, tout comme la pertinence des liens dans leur contexte. Le texte des ancres et la taille de la police sont également pris en compte, tout comme les liens internes qui peuvent avoir un impact différent des liens non interne.

pagerank (type: integer(), default: nil) - PageRank du document. Un entier représentant l’autorité ou la qualité perçue du document selon l’algorithme PageRank de Google.

csePagerankCutoff (type: integer(), default: nil) - Seuil de PageRank pour l’index CSE. Cet attribut spécifie que l’URL ne doit être sélectionnée pour l’index CSE que si son PageRank est supérieur au seuil cse_pagerank_cutoff.

anchor (type: list(GoogleApi.ContentWarehouse.V1.Model.AnchorsAnchor.t), default: nil) - Liste des ancres dans le document.

homepageAnchorsDropped (type: String.t, default: nil) - Nombre total d’ancres de la page d’accueil supprimées dans AnchorAccumulator.

localAnchorsDropped (type: String.t, default: nil) - Nombre total d’ancres internes non-page d’accueil déposées dans AnchorAccumulator.

nonlocalAnchorsDropped (type: String.t, default: nil) - Nombre total d’ancres non locales déposées dans AnchorAccumulator..

redundantAnchorsDropped (type: String.t, default: nil) - Nombre total d’ancres redondantes déposées dans linkextractor.

creationDate (type: integer(), default: nil) - Date de création utilisée pour l’historique. Indique la première et la dernière fois que cette ancre a été vue.

origText (type: String.t, default: nil) - Texte original de l’ancre, incluant la capitalisation et la ponctuation.

fontsize (type: integer(), default: nil) - Taille de la police de l’ancre.

sourceType (type: integer(), default: nil) - Qualité de la page source de l’ancre, corrélée mais non identique au niveau d’index de la page source.

pagerankWeight (type: number(), default: nil) - Poids stocké dans les linkmaps pour le pageranker.

isLocal (type: boolean(), default: nil) - Indique si les pages source et cible de l’ancre sont sur le même domaine.

fullLeftContext (type: list(String.t), default: nil) - Contexte complet à gauche de l’ancre.

expired (type: boolean(), default: nil) - Indique si le domaine de l’ancre est expiré.

deletionDate (type: integer(), default: nil) - Date de suppression de l’ancre.

linkTags (type: list(integer()), default: nil) - Informations sur le type de lien, la page source, etc.

forwardingTypes (type: integer(), default: nil) - Comment l’ancre est transférée au canonique, disponible uniquement pour les ancres transférées.

parallelLinks (type: integer(), default: nil) - Nombre de liens supplémentaires de la même page source vers le même domaine cible.

text (type: String.t, default: nil) - Mots d’ancre délimités par des espaces.

source (type: GoogleApi.ContentWarehouse.V1.Model.AnchorsAnchorSource.t, default: nil) - Source de l’ancre.

fullRightContext (type: list(String.t), default: nil) - Contexte complet à droite de l’ancre.

compressedOriginalTargetUrl (type: String.t, default: nil) - URL cible originale compressée de l’ancre.

firstseenDate (type: integer(), default: nil) - Nombre de jours depuis le 31 décembre 1994 que ce lien a été vu pour la première fois.

context (type: integer(), default: nil) - Contexte de l’ancre.

firstseenNearCreation (type: boolean(), default: nil) - Indique si la date de première vue est une estimation précise du moment où le lien a été ajouté à la page source.

lastUpdateTimestamp (type: integer(), default: nil) - Horodatage de la dernière mise à jour de l’ancre dans l’indexation.

weight (type: integer(), default: nil) - Poids de l’ancre sur une échelle de 0 à 127.

deleted (type: boolean(), default: nil) - Indique si l’ancre a été supprimée.

encodedNewsAnchorData (type: integer(), default: nil) - Données encodées contenant des informations sur la « nouveauté » de l’ancre

Focus Google Penguin

Les pages peuvent être pénalisées par de mauvais backlinks, et cette pénalité est mesurée par un score allant de 0 (bon) à 1 (mauvais). La protection de la qualité des ancres initiales peut protéger un document contre les pénalités précoces de Penguin tandis que les ancres redondantes et de faible qualité sont souvent supprimées.

Les ancres transférées hors domaine et les ancres internes sont également surveillées, tout comme le nombre total d’ancres sur site et hors domaine. Enfin, les mesures telles que le degré de sortie local minimum des pages d’accueil de domaine et le nombre de paires domaine/phrase au-dessus de la limite sont utilisées pour affiner l’évaluation.

penguinLastUpdate (type: integer(), default: nil) - Timestamp de la dernière mise à jour des scores Penguin, mesuré en jours depuis le 1er janvier 1995.

badbacklinksPenalized (type: boolean(), default: nil) - Indique si le document est pénalisé par des mauvais backlinks, auquel cas le score d’improvanchor ne doit pas être utilisé.

penguinPenalty (type: number(), default: nil) - Pénalité Penguin au niveau de la page (0 = bon, 1 = mauvais).

nonLocalAnchorCount (type: integer(), default: nil) - Nombre total d’ancres non internes.

mediumCorpusAnchorCount (type: integer(), default: nil) - Nombre total d’ancres dans le corpus moyen.

penguinEarlyAnchorProtected (type: boolean(), default: nil) - Indique si le document est protégé par la qualité des ancres initiales.

droppedHomepageAnchorCount (type: integer(), default: nil) - Nombre total d’ancres de la page d’accueil supprimées.

redundantanchorinfoforphrasecap (type: list(GoogleApi.ContentWarehouse.V1.Model.IndexingDocjoinerAnchorStatisticsRedundantAnchorInfoForPhraseCap.t), default: nil) - Informations sur les ancres redondantes pour le plafond de phrase.

forwardedOffdomainAnchorCount (type: integer(), default: nil) - Nombre total d’ancres transférées hors domaine.

droppedNonLocalAnchorCount (type: integer(), default: nil) - Nombre total d’ancres non internes supprimées.

perdupstats (type: list(GoogleApi.ContentWarehouse.V1.Model.IndexingDocjoinerAnchorStatisticsPerDupStats.t), default: nil) - Statistiques par duplication.

onsiteAnchorCount (type: integer(), default: nil) - Nombre total d’ancres sur site.

droppedLocalAnchorCount (type: integer(), default: nil) - Nombre total d’ancres internes supprimées.

penguinTooManySources (type: boolean(), default: nil) - Indique si le document n’est pas évalué car il a trop de sources d’ancres.

forwardedAnchorCount (type: integer(), default: nil) - Nombre total d’ancres transférées.

anchorSpamInfo (type: GoogleApi.ContentWarehouse.V1.Model.IndexingDocjoinerAnchorSpamInfo.t, default: nil) - Structure contenant les signaux et les pénalités du AnchorSpamPenalizer.

lowCorpusAnchorCount (type: integer(), default: nil) - Nombre total d’ancres dans le corpus faible.

lowCorpusOffdomainAnchorCount (type: integer(), default: nil) - Nombre total d’ancres hors domaine dans le corpus faible.

baseAnchorCount (type: integer(), default: nil) - Nombre total d’ancres de base.

minDomainHomePageLocalOutdegree (type: integer(), default: nil) - Degré de sortie local minimum de toutes les sources d’ancres qui sont des pages d’accueil de domaine et sur le même domaine que l’URL cible actuelle.

skippedAccumulate (type: integer(), default: nil) - Nombre de fois que l’accumulation d’ancres a été ignorée pour ce document.

topPrOnsiteAnchorCount (type: integer(), default: nil) - Nombre d’ancres sur site avec un pagerank supérieur à 51000.

pageMismatchTaggedAnchors (type: integer(), default: nil) - Nombre d’ancres étiquetées comme non correspondantes à la page.

spamLog10Odds (type: number(), default: nil) - Log base 10 des chances que cet ensemble d’ancres présente un comportement spammy.

redundantanchorinfo (type: list(GoogleApi.ContentWarehouse.V1.Model.IndexingDocjoinerAnchorStatisticsRedundantAnchorInfo.t), default: nil) - Informations sur les ancres redondantes.

pageFromExpiredTaggedAnchors (type: integer(), default: nil) - Défini dans SignalPenalizer::FillInAnchorStatistics.

baseOffdomainAnchorCount (type: integer(), default: nil) - Nombre total d’ancres de base hors domaine.

phraseAnchorSpamInfo (type: GoogleApi.ContentWarehouse.V1.Model.IndexingDocjoinerAnchorPhraseSpamInfo.t, default: nil) - Signaux identifiant les pics de phrases d’ancres spammy.

topPrOffdomainAnchorCount (type: integer(), default: nil) - Nombre d’ancres hors domaine avec un pagerank élevé.

localAnchorCount (type: integer(), default: nil) - Nombre total d’ancres internes.

fakeAnchorCount (type: integer(), default: nil) - Nombre total d’ancres factices.

redundantAnchorForPhraseCapCount (type: integer(), default: nil) - Nombre total d’ancres supprimées en raison du plafond de phrases par domaine.

totalDomainPhrasePairsAboveLimit (type: integer(), default: nil) - Nombre de paires domaine/phrase au-dessus de la limite.

timestamp (type: integer(), default: nil) - Temps wall de la dernière accumulation d’ancres.

Informations classiques

Il faut fuir le nofollow

Vous êtes content de cette information ? Pour être plus précis, il ne faut toujours pas utiliser un lien en nofollow, car quand un autre lien pointe vers la même URL à partir d’une page, Google lui ajouterait le même attribut :

isNofollow (type: boolean(), default: nil) - S’il s’agit d’un lien nofollow. Si la page contient plusieurs liens vers la même URL, ils doivent tous être nofollow pour définir ce champ.

Nombre de liens entrants pondérés

numIncomingAnchors (type: number(), default: nil) - Le nombre pondéré de liens entrants (liens provenant d’autres documents). Cet attribut indique combien de liens pointent vers un document donné. Les liens entrants sont pondérés pour refléter leur importance ou leur pertinence, ce qui signifie que certains liens peuvent avoir plus de poids que d’autres dans l’évaluation de l’autorité d’un document.

Transfert de popularité

forwardingTypes (type: integer(), default: nil) - Comment l’ancre est transférée au canonique, disponible uniquement pour les ancres transférées.

Contenu : termes saillants et duplication

Ici on parle de création de descripteurs (terme sans ambiguité, donc un regroupement de mots avec le même sens (sans synonyme ou homographe)) pour accélérer les phases de création de SERPs, séparer les termes qui sont du bruit et non discriminants.

salientTerms (type: GoogleApi.ContentWarehouse.V1.Model.QualitySalientTermsSalientTermSet.t, default: nil) - Les termes saillants pour ce document. Ce champ n’est défini que si le paramètre --webref_doc_metadata_copy_salient_terms est activé. Les termes saillants sont des mots ou des phrases clés qui caractérisent le contenu principal du document, aidant à identifier de quoi il s’agit.

Le fameux TF (Term Frequency) est utilisé (vous vous souvenez du calcul de TF.IDF. ?), mais uniquement en mode débogage :
noiseCorrection (type : number(), valeur par défaut : nil) - Fréquence minimale d’un terme pour qu’il ne soit pas considéré comme du bruit. Bien que l’intervalle possible de valeurs pour ce champ soit [0, observed_volume], il est généralement attendu qu’il représente un petit pourcentage du volume observé (par exemple, 5%).

Côté duplication de contenu, SimHash entre en jeu, cependant nous ne savons pas combien de bits sont utilisées pour analyser les documents.
simhashV2 (type : String.t, valeur par défaut : nil) - Simhash-v2 est généré par SimHashParseHandler, conçu pour remplacer complètement simhash-v1 (connu aussi sous le nom de simhash original) de ApproxDupsParseHandler. Simhash-v2 utilise un algorithme révisé et devrait, dans la plupart des cas, fonctionner mieux que simhash-v1. Ils coexistent pendant la période de transition actuelle, puis simhash-v1 sera retiré.
simhashV2Significance (type : float(), valeur par défaut : nil) - La signification de simhash-v2 est utilisée pour décrire la confiance concernant la valeur correspondante de simhash-v2. Elle est définie comme la différence moyenne absolue par rapport à zéro de tous les composants d’état interne lors de la finalisation d’une valeur de simhash-v2 dans HashMultiSetDotCauchy. Nous avions l’habitude de comparer la signification à un seuil prédéfini (valeur par défaut : 20) pour obtenir une valeur booléenne « trusted_simhash_v2 ». Cependant, il est possible que ce champ manque alors que « simhash_v2 » est présent, dans ce cas (1) Utilisez « SimHashIsTrusted » s’il est présent, ET/OU (2) Supposons que « simhash_v2 » est fiable si sa valeur est non nulle.

Titre du document

title (type: String.t, default: nil) - Le titre du document. Ce champ n’est défini que si le paramètre --webref_doc_metadata_set_title est activé. Le titre peut être utilisé pour apprendre des informations comme : si le titre contient « restaurants », il est plus probable que la page soit une liste de restaurants. Cela aide les algorithmes de Google à catégoriser et à comprendre le contenu du document.

titleScore (type: number(), default: nil) - Score du titre. Un nombre représentant l’importance ou la pertinence du titre du document pour les résultats de recherche.

Du crawl au classement des pages

Google Search utilise divers systèmes pour le crawl, l’indexation et le rendu des pages web, dont certains ont déjà été cité fin 2023 lors des différents procès aux Etats-Unis. Trawler gère le crawl avec des files d’attente et des taux de crawl optimisés. L’indexation est assurée par Alexandria, soutenu par SegIndexer pour classer les documents en niveaux et TeraGoogle pour l’indexation à long terme. HtmlrenderWebkitHeadless se charge du rendu des pages JavaScript.

Le classement et le service des pages sont orchestrés par Mustang, avec Ascorer pour le classement initial, NavBoost pour le re-classement basé sur les clics, et FreshnessTwiddler pour la fraîcheur des documents. Google Web Server (GWS) et SuperRoot gèrent la diffusion et le post-traitement des résultats. SnippetBrain génère les extraits, Glue assemble les résultats universels en fonction du comportement des utilisateurs, et Cookbook crée des signaux en temps réel.

A retenir

Les bases du SEO sont toujours là, mais on ajoute toujours plus de données utilisateurs. Cette documentation laisse à penser que le domaine a un poids bien au delà de la simple popularité, mais aussi que Google intervient manuellement alors qu’il déclare depuis des années (argument politique, judiciaire et de communication) que ce n’est pas le cas !

Je retiens que les SEO connaissent assez bien le fonctionnement de Google, même s’il y a de petites pépites dans les données (en particulier pour les liens : interne/externe, âge, mais aussi sur le domaine : âge, visites total via Chrome, thématisation, liste blanche…).

Au final, si votre site convient aux utilisateurs, cela surpassera l’optimisation de votre contenu, la puissance de vos concurrents… mais nous savons très bien que pour se positionner, ces éléments sont importants. Bref, de la qualité, toujours plus de qualité.

7 réflexions au sujet de “Tout sur les fuites de l’API de Google Search : une mine d’informations pour les SEO”

  1. Super article Aurélien, comme toujours ! De la qualité, toujours de la qualité. Je confirme pour les scores Covid et élections que j’ai vus en action à de multiples reprises, et qui sont effectivement forcément l’objet de réglages pas seulement algo mais aussi manuels.
    Merci pour le partage.

    Répondre
  2. Super boulot, merci ! A quand un leak complémentaire sur le scoring et par exemple le contexte concurrentiel d’une thématique ? L’analyse des pages présentes en top 10 sur « rachat de crédit » ou « assurance voiture » de donne pas les même *métriques moyennes* onsite et offsite qu’une thèma moins concurrentielle. Erfan Azimi si tu nous lis ^^

    Répondre
  3. Ca fait du bien de lire un peu des articles de qualite sur le SEO. Ca faisait longtemps.

    Je n’ai pas fait autant d’analyse que toi sur le doc lui meme (que c’est long ce machin) mais dan l’absolu et compte tenu de tous les resumes et dissections que j’ai pu lire le consensus est bien resume dans ton article.

    faut que je meremette un peu a ecrire aussi … pfff

    Répondre
  4. a t-on une idée de quand datent ces documents ? Car en fonction de l’année où ils ont été rédigés, on pourrait faire des corrélations avec des core update passées.

    Répondre
  5. Merci pour ce travail malgré la présence de « Ces informations sont cruciales » est donc, de fait, la preuve évidente que c’est chatGPT qui a écrit cet article.

    Juste une petite remarque à propos des informations sur les ancres (localAnchorsDropped et autres). Il s’agit probablement plus du nombre total d’ancres non-internes déposées (dropped in) et non supprimées dans AnchorAccumulator, non ?

    Répondre

Laisser un commentaire