Création d'un Google Custom Search Engine, partie II, exemple concret
Le jeudi 7 décembre 2006 à 09:31 :: Google :: #55
Dans un précédent billet, j’avais abordé certains des principaux concepts à maîtriser pour utiliser les fonctionnalités avancées de Google Custom Search Engine.
C’était un peu aride et théorique, donc aujourd’hui, place à la pratique, avec un exemple concret et relativement complet de création d’un CSE faisant appel à quelques unes de ces techniques avancées.
On part du principe que le CSE de base a été créé via l’interface de Google, et que le nom, la description, l’aspect et quelques autres options de votre CSE ont déjà été définies.
Pour les fonctionnalités avancées, l’interface en ligne n’est plus suffisante, elle ne permet pas d’accéder à certaines options et il est beaucoup plus pratique de travailler directement sur les fichiers de configuration et d’annotations.
Certains éléments dont il est question dans ce billet ont été expliqués en détail dans le billet précédent, j’en expliquerais donc ici la mise en œuvre pratique mais je ne reviendrais pas sur leurs fondements. Donc pour plus d’informations sur :
- Le fichier de contexte ou spécification XML (Context file)
- Le fichier d’annotations (Annotations label file)
- Les motifs d’URL ( URL Patterns )
- Les labels
- Les background labels
Je vous invite à aller voir ce billet : Google Custom Search Engine, fonctionnalités avancées.
Commençons par le commencement : la sélection des sites à inclure dans notre CSE.
Le fichier d’annotation.
La liste des sites se trouve dans le fichier d’annotations. Ce peut être au choix un fichier de type OPML, TSV ou XML. Seul les deux derniers présentent un réel intérêt, le premier étant trop limité. Dans cet exemple nous utiliserons le format XML.
(Les fichiers XML peuvent être édités avec n’importe quel bloc-notes, ou un éditeur spécialisé comme l’excellent XML Copy Editor qui est gratuit et open source.)
Tout d’abord, on commence par télécharger le fichier d’annotations généré automatiquement par Google lors de la création du CSE.
Vous avez dû inclure au moins un site dans votre sélection, c’est à ce moment que ce fichier a été créer par Google.
Dans le panneau de contrôle de votre CSE, sous l’onglet « Advanced », vous devriez voir quelque chose ressemblant à ça :
La première ligne est la déclaration de version et d’encodage du format XML et n’a pas à être modifiée.
La seconde correspond au nombre d’annotations présentes dans le fichier. Chaque annotation correspond à un motif d’URL (Site, partie de site ou page spécifique) dans cet exemple, il y a 133 sources dans le fichier.
Ensuite, la balise :
<Annotation about="www.webmaster-hub.com/index.php*" score="1">
signifie qu’une des sources du CSE sera toutes les pages commençant par www.webmaster-hub.com/index.php (cela correspond aux pages des forums du Hub).
(Pour choisir avec précision qu’elles pages inclure ou exclure grâce aux motifs d’URL, voir la partie « motifs d’URL » de l’article précédent.)
L’attribut score="1" de cette balise permet de modifier le “poids” attribué à la page. Nous y reviendrons plus loin.
La seconde balise, <Label name="_cse_io5vuad5to8"/> est l’un des 2 labels crées automatiquement par Google à l’initialisation du CSE.
La chaîne « _cse_io5vuad5to8 » est générée aléatoirement est sera donc différente pour chaque CSE.
Ce label signifie qu’une annotation le possédant sera inclue dans la sélection. Autrement dit, la présence de ce label dans l’annotation relative à une URL spécifie que ce site sera inclus lors de la recherche.
Il est donc nécessaire qu’il soit présent dans toutes les annotations relatives aux sites que vous souhaitez chercher.
Un autre label créé automatiquement par Google est « _cse_exclude_io5vuad5to8 » qui aura l’effet contraire ; si dans le fichier d’annotations vous remplacez le label d’inclusion par celui-ci, cela signifie que l’URL sera explicitement exclue lors d’une recherche.
Chaque annotation (chaque source) doit donc se présenter sous cette forme :
<Annotation about="motif_d_URL_à_chercher" score="1"> <Label name="_cse_io5vuad5to8"/> </Annotation>
où cette forme :
<Annotation about="motif_d_URL_à_exclure" score="1"> <Label name="_cse_exclude_io5vuad5to8"/> </Annotation>
Ces 2 labels sont mutuellement exclusifs, un motif d’URL ne peut pas être à la fois inclus et exclus, chaque annotation doit donc posséder soit l’un, soit l’autre.
(A noter que les noms par défaut choisis par Google : _cse_io5vuad5to8 et _cse_exclude_io5vuad5to8, peuvent être modifiés. Vous pouvez les renommer mais ils doivent être uniques, en minuscule, et être déclarés dans les « Background Labels ».)
Dans un fichier d’annotations de base, il n’y a qu’un seul label par annotation. Cependant, le nombre de labels n’est pas limité et nous verrons comment en rajouter.
En attendant, c’est ici que l’on doit lister tous les sites que l’on souhaite inclure ou exclure de notre recherche.
Le fichier de spécification (Context file)
Toujours dans l’onglet « Advanced » de l’interface Google, vous pouvez télécharger le fichier de spécifications en cliquant sur le lien « Download » :
Les attributes « keywords », « Title » et « Description » correspondent aux choix que vous avez fait au moment de la création du CSE dans l’interface.
On y retrouve les 2 labels définis par Google, le label d’inclusion et celui d’exclusion.
C’est ici que nous allons définir le comportement global de notre CSE.
Le premier des Background Label :
<Label name="_cse_io5vuad5to8" mode="FILTER"/>
Signifie que les sites portant le label « _cse_io5vuad5to8 » dans le fichier d’annotations seront filtrés.
C’est à dire qu’une recherche faite sur notre CSE ne cherchera que dans ces sites, les autres sites du Web n’apparaîtront pas dans les résultats de recherche.
Cela a été déterminé dans l’onglet « Basics » de l’interface, au moment de la création du CSE:
Si l’on a choisi la seconde option : « Chercher dans tous les sites mais favoriser les sites sélectionnés », le mode sera « BOOST » au lieu de « FILTER » et comportera un attribut « weight » qui déterminera le degré de « favoritisme ».
Il prendra cet forme :
<Label name="_cse_io5vuad5to8” mode="BOOST” weight="0.69999999" />
La valeur “0.699999999” étant la valeur par défaut, celle-ci pouvant varier entre –1 et 1.
Le second Background Label :
<Label name="_cse_exclude_io5vuad5to8" mode="ELIMINATE"/>
Signifie que tous les sites taggés (dans le fichier d’annotations) avec « _cse_exclude_io5vuad5to8 » seront exclus de la recherche.
Grâce aux URLs que nous avons inclus ou exclus dans le fichier d’annotations et donc à la sélection des sources, nous avons atteint en partie l’un des buts d’un Custom Search Engine, c’est à dire l’amélioration de la pertinence des résultats.
Affiner les résultats.
Une autre raison pour utiliser un CSE est de permettre un affinage des résultats de recherche par l’utilisateur.
Pour le CSE de Moteurs News, par exemple, une fois la recherche initiale effectuée, il est possible de filtrer les résultats en fonction de la langue (anglais ou français), ou en fonction de la nature de la source (site ou forum).
Pour cela, il est nécessaire de créer et de définir des « refinements ».
Ce sont les « liens » qui apparaissent en haut des résultats.
Pour ce faire, il y a 2 étapes :
- Définir ces refinements dans le fichier contexte.
- Tagger avec les labels attribués à ces refinements les URLs inclues dans le fichier d’annotation.
Le début du context file du CSE de ce site ressemble à ça :
<?xml version="1.0" encoding="UTF-8"?>
<CustomSearchEngine version="1.0" volunteers="true"
keywords="référencement seo google yahoo msn"
Title="Moteurs News" Description="Moteur News">
<Context>
<Facet>
<FacetItem Title="English Web Sites & Forums">
<Label name="anglophone" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
</FacetItem>
<FacetItem Title="English Web Sites">
<Label name="en_sites" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
</FacetItem>
<FacetItem Title="English language forums">
<Label name="en_forums" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
</FacetItem>
</Facet>
<Facet>
<FacetItem Title="Sites & forums en français">
<Label name="francophone" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
</FacetItem>
<FacetItem Title="Sites en français">
<Label name="fr_sites" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
</FacetItem>
<FacetItem Title="Forums en français">
<Label name="fr_forums" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
</FacetItem>
</Facet>
Les « Facet » et « FacetItem » qu’on peut approximativement traduire par « groupe » et « élément de groupe » représentent ces liens en haut des résultats de recherche, ils servent à organiser la façon dont ces liens seront agencés.
Il peut y avoir jusqu’à 4 groupes (Facet) chacun contenant jusqu’à 4 éléments (FacetItem).
Dans cet exemple précis je n’utilise que 2 Facet (Anglais / Français) et 3 FacetItem pour chaque Facet :
- Sites + forums anglais
- Sites Anglais
- Forums anglais
et
- Sites + forums français
- Sites français
- Forums français
ce qui nous donne une présentation de ce type :
English Web Sites & Forums Sites & forums en français English Web Sites Sites en français English language Forums Forums en français
Un clic sur n’importe lequel de ces “raffinements” aura pour effet de limiter la recherche à l’une de ces catégories.
Chaque FacetItem possède un attribut « Title » :
<FacetItem Title="Sites en français">
Ce titre apparaîtra sur la page de résultats. C’est le « lien ».
et un élément « label » :
<Label name="fr_sites" mode="FILTER"
Rewrite="" IgnoreBackgroundLabels="false"/>
Le nom de ce label « fr_sites » est celui avec lequel nous devrons tagger toutes les URLs que nous voudront retenir dans la sélection « sites en français ».
Le mode « FILTER » possède la même signification que précédemment, c’est à dire que seules les URLs possédant ce label seront retenues, toutes les autres seront exclues de la recherche.
Ainsi dans notre fichier d’annotations, un site que nous voulons inclure dans la catégorie « sites en français » devra être annoté de cette manière :
<Annotation about="motif_d_URL_à_chercher" score="1"> <Label name="_cse_io5vuad5to8"/> <Label name="fr_sites"/> </Annotation>
On attribue à cette URL le label “fr_sites” et lorsque l’utilisateur clique sur le raffinement « sites français », seuls les résultats en provenance des sites possédant ce label sont affichés.
Améliorer (encore) la pertinence des résultats.
Grâce à la sélection précise de sites à retenir ou à exclure de notre index effectuée dans le fichier d’annotations, on a fait un premier pas dans l’amélioration de la pertinence.
Mais l’ordre des résultats affichés est encore déterminé par l’algorithme de Google. Il faut bien garder à l’esprit que le moteur d’un CSE reste Google et son algorithme.
Dans l’absolu, si on incluais dans notre fichier d’annotations la liste de tous les sites web, les résultats ne différaient pas de ceux fournis par Google.
En réduisant la taille de l’index nous avons donc amélioré la pertinence en excluant tous les sites jugés de moindre valeur mais il est possible de faire encore mieux en « ajustant l’algorithme de Google » (Le rêve de beaucoup de référenceurs j’en suis sûr :D).
Il y a plusieurs bonnes raisons pour vouloir modifier le classement des résultats :
- On peut vouloir privilégier certains sites que l’on estime être les références absolues dans le domaine de notre CSE.
- On peut vouloir contrebalancer les résultats naturels de Google qui favorise certains gros sites ayant des techniques d’optimisation très efficaces.
- On peut vouloir que son site sorte premier sur la majorité des requêtes. (Ce n’est sans doute pas la meilleure des raisons …)
En ce qui concerne le CSE de Moteurs News, c’est la seconde qui m’a poussé à intervenir sur le « poids » plus ou moins grand à attribuer à certaines sources.
Avant ajustement, pour certaines requêtes, des pages en provenance d’un seul site pouvaient truster 9 résultats sur 10. Hors ces pages n’étaient pas forcément les plus pertinentes, mais du fait d’une très bonne optimisation, elles sortaient très bien dans les résultats de recherche.
Le but était donc d’équilibrer ces résultats et de donner le choix, à celui effectuant la recherche, entre différentes sources, toutes de qualité puisque incluses dans mon index.
Le plus simple dans le cas présent était de « défavoriser » certains sites pour laisser leurs chances aux autres.
Cela se passe toujours au niveau du context file. Dans la partie BackgroundLabels, en plus des labels d’inclusion et d’exclusion, il faut créer un label supplémentaire auquel on attribue le mode « BOOST ».
Ce label, je l’ai appelé « low », et lui ai attribué un poids de –0.3. Il s’écrit ainsi :
<Label name="low" mode="BOOST" weight="-0.3" />
Cela signifie que toutes les URLs du fichier d’annotations taggées avec le label “low” seront légèrement « handicapées » dans les résultats.
Le poids (weight) peut varier entre –1 et +1 (-1 le site étant handicapé au maximum et +1 favorisé au maximum).
Dans le context file, la partie BackgroundLabels ressemble donc à ça :
<BackgroundLabels>
<Label name="_cse_io5vuad5to8" mode="FILTER"/>
<Label name="low" mode="BOOST" weight="-0.3" />
<Label name="_cse_io5vuad5to8" mode="ELIMINATE"/>
</BackgroundLabels>
Et dans le fichier d’annotation, cela prend cette forme :
<Annotation about="URL à déprécier" score="1"> <Label name="_cse_io5vuad5to8"/> <Label name="francophone"/> <Label name="fr_forums"/> <Label name="low"/>
Ce site ressortira donc dans les résultats pour une recherche :
- globale (recherche par défaut)
- sur les « sites et forums en français » (francophone)
- sur les « forums en français » (fr_forums)
et à chaque fois, il sera légèrement handicapé pour ne pas accaparer une trop grande part des résultats.
La détermination de la valeur à donner à « weight » et assez délicate. Il faut faire de nombreux essais pour arriver à un juste équilibre.
Je n’ai ici défini qu’un seul label de pondération, mais on peut très bien en créer plusieurs avec différentes valeurs (ex : low = -0,3 ; high = 0,5), et attribuer l’un ou l’autre à certaines des URLs selon qu’on souhaite les favoriser ou les déprécier.
Un autre moyen de faire varier le poids d’une source est de jouer sur l’attribut « score » présent dans le fichier d’annotation :
<Annotation about="motif_d_URL_à_chercher" score="1"> <Label name="_cse_io5vuad5to8"/> </Annotation>
Par défaut le score est de 1. La valeur de score peut varier de –1 à 1, l’attribution d’une valeur élevée à une annotation signifie que celle-ci est particulièrement pertinente sur ses labels.
Après quelques tests, je trouve son utilisation difficile à mettre en place, les résultats obtenus n’était pas très convaincant. Sans doute les labels retenus pour ce CSE en particulier s’y prêtent t-ils mal. Et dans la mesure ou une annotation peut avoir plusieurs labels (francophone, forum français, low), l’affectation d’un critère de pertinence à ces 3 labels en même temps ne me semble pas évidente.
Peut être cela convient-il mieux pour des CSE possédant une autre structure. Par exemple, on peut imaginer que les sources, selon leurs natures, soient taggées avec des labels de niveaux exclusifs (experts, amateurs, débutants), chaque source ne possédant qu’un seul label. L’affectation d’un score de pertinence en fonction de la nature des documents présent sur un site pourrait alors avoir son utilité.
Ou l’utilisation de l’attribut score peut éventuellement servir à un ajustage encore plus fin des résultats, mais là encore la règle semble être de procéder par essais et erreurs jusqu’à l’obtention d’un résultat satisfaisant.
Une fois que l’édition des deux fichiers est finie, il ne reste plus qu’à les uploader via l’interface de Google.
A ce moment, les fichiers sont parsé, et si une erreur est détectée (une balise mal fermée, un caractère interdit…) un message est affiché en rouge avec le numéro de ligne à laquelle l’erreur s’est produite.
Bon, je récapitule :
- dans le fichier d’annotations, sélectionner les sources (motifs d’URL) à retenir pour la recherche
- dans le fichier de spécifications (context file), définir et organiser les « refinements » qui permettront à l’utilisateur d’affiner la recherche
- tagger les sources incluses dans le fichier d’annotations avec les labels définis pour les « refinements »
- tester, et si besoin :
- pondérer les résultats en affectant à certaines sources des « poids » plus ou moins élevés. Ces « poids » étant définis par des labels dans les Background Labels du context file qui sont ensuite assignés à chacune des URLs que l’on souhaite pondérer.
Et voilà, on a un Custom Search Engine en état de marche, son Google à soi.
Il y a d’autres fonctionnalités avancées que je n’ai pas abordées dans cet article dans la mesure où je ne les ai pas utilisé pour ce CSE. Selon ce que l’on souhaite faire certaines présentent un réel intérêt.
On peut par exemple réécrire la requête de l’internaute au moment d’un raffinement (rewrite).
On peut aussi rediriger cette requête sur une URL externe (redirect). C’est cette dernière technique qui est utilisée notamment pour imbriquer plusieurs CSE : un clic sur un raffinement redirigeant vers un autre CSE comportant lui même des raffinements.
Utile surtout pour des gros CSE nécessitant beaucoup de raffinements différents (+ de 16 car c'est la limite : 4 Facet possédant chacun 4 FacetItem) ou des structures particulières.
Pour ceux que cela intéresse (ou ceux qui ne trouveraient pas mes explications très claires), la meilleure source de documentation est l’aide officielle :
http://www.google.com/coop/docs/cse/
(Uniquement disponible en anglais pour l’instant)
Et pour les geeks absolus, sachez que les CSE peuvent aussi être contrôlés via l’AJAX Search API de Google.
jeudi 7 décembre 2006 | 09:31, Sergi




English

Commentaires
1. Le jeudi 30 août 2007 à 00:36, par Le débutant
2. Le jeudi 30 août 2007 à 01:07, par Sergi
Ajouter un commentaire