Français - English
Source: svn://svn.saintamh.org/code/search/trunk/
Source (en couleurs): http://svn.saintamh.org/code/search/trunk/

Ce programme offre une interface de recherche Web semblable à un Google simplifié, mais combine les résultats de divers engins de recherche (Google, Bing, Yandex et Exalead).

Contexte

Quand Microsoft a lancé son moteur de recherche Bing en 2009, un de leurs employés a publié un outil appelé Blind Search, où l'usager fait une recherche, et les résultats de Google, Bing et Yahoo sont affichés en trois colonnes, une par moteur, sans montrer à quel moteur correspond chaque colonne. J'ai utilisé l'outil comme principal moteur de recherche pour une semaine ou deux, et j'ai pu contaster que, contrairement à ce que j'aurais cru :

  1. les résultats sont très différents d'un moteur à l'autre;

  2. Google ne donne pas toujours les meilleur résultats;

  3. les résultats de Bing sont parfois très bons.

Tout ça m'a fait penser que j'aurais peut-être plus de succès dans mes recherches si j'utilisais une combinaisons des trois moteurs. Le Blind Search n'est pas très pratique pour l'usage quotidien, alors j'ai décidé d'écrire mon propre outil.

Il y a des services disponibles sur le Web qui font déjà ce que ce script fait (et probablement mieux), mais ils contiennent de la pub, et ce n'est pas moi qui les ai écrits, donc ils sont plates.

Algorithmes

Il n'y a rien de très compliqué ici algorithmiquement parlant. Pour que ça ne soit pas excessivement lent, les requêtes à chaque moteur sont faites en parallèle, mais comme la version de Perl sur mon serveur n'avait pas de threads, j'utilise des sous-processus, ce qui a compliqué un peu les choses pour partager les données entre les processus. J'ai créé pour ça une petit librarie de sérialisation.

Le défi le plus intéressant a été de combiner les résultats des divers moteurs de sorte que les plus pertinents apparaissent en premier. Par exemple, si un résultat A apparaît en tête de liste chez le moteur X, mais en 8e position chez les moteurs Y et Z, on le met où?

Après quelques expérimentations, j'ai fini par adopter une approche toute simple, qui marche très bien : on trie les résultats selon la plus haute position qui leur a été donnée par tous les moteurs. Les ex-aequo sont séparés selon le nombre de moteurs qui placent le résultats à cette position, et sont la 2e, 3e, etc. plus haute position. Donc dans l'exemple qui précède, on mettrait le résultat X1-Y8-Z8 plus haut que X2-Y2-Z2 (même si ce dernier a une meilleure position moyenne), mais après X2-Y1-Z1 (parce que ce dernier est classé premier par 2 moteurs plutôt qu'un).

Résultats

Le programme compile des statistiques qui décrivent les résultats (en anglais). En gros, on y voit que Google donne effectivement les meilleurs résultats : je clique plus souvent sur les résultats de Google (NB le programme n'affiche pas de quel moteur vient chaque résultat), et Google montre plus de résultats qui ne sont pas donnés par les autres moteurs.

Mais les données montrent aussi que Google n'est pas suffisant : un résultat sur quatre sur lequel je clique n'apparaît simplement pas dans les résultats de Google (du moins pas sur la première page). C'est pourquoi je continue d'utiliser cet outil pour toutes mes recherches sur le Web.