Comment refaire Google Instant et Scribe soit-même avec de l’AJAX et MySQL

Script.aculo.us est un petit script dont je n’avais jamais parlé ici pour la simple raison que je n’ai pas eu l’occasion de le tester moi-même (j’ai honte). Pourtant, ce script est utilisé un peu partout sur le web quand il s’agit notamment de créer une auto-complétion dans les barres de recherche. En fait, Script.aculo.us est un addon de la librairie Javascript Prototype, et permet entre-autres de créer de l’auto-complétion. L’auto-complétion consiste en l’affichage d’un box de résultats « suggérés » en temps réel pendant que vous tapez.    

Plus précisément, vous intégrez Script.Aculo.us à votre page avec Prototype ; puis vous créez une barre de recherche, et enfin, vous mettez en face un serveur (ci-dessous, en PHP) capable de répondre à vos différentes requètes qui seront faites en AJAX. Un tutoriel très bien fait est disponible ici.

Pour revenir à nos moutons, il suffirait pour recréer un Google Instant, de placer dans une iframe en dessous de sa barre de recherche un page de résultat Google (par exemple avec Google Custom Search, qui permet de n’avoir que les résultats (et les pubs si vous choisissez d’en laisser), avec au dessus, dans la barre de recherche, une adaptation du script.aculo.us qui non seulement affiche une pré-box de résultats (reste à savoir où la trouver, cette pré-box… par exemple avec Scribe, mais ce serait de la triche car cela ne nécessiterait plus le script JS).

Refaire Google Scribe / Google Instant soit-même : spécification

Refaire Google Scribe ne me semble pas complètement horrible techniquement, et c’est la raison pour laquelle j’ai passé quelques minutes à écrire une petite spécification fonctionnelle (et un peu technique) pour cette application, avec, comme pré-requis en terme d’outil, un tout petit peu d’AJAX et une base MySQL.

Besoin : fournir des listes de 10 éléments, dont chaque élément est un ensemble de terme commençants par le terme déjà écrit dans la barre de recherche.

Il faut donc constituer une base de données de phrases (de 3, 4 ou 5 termes), que l’on pourrait créer par exemple à partir de l’aspiration de blogs ou de journaux en ligne, en ne retenant que le contenu « utile » (le contenu de chaque billet, pas les méta-infos, commentaires ou autres liens sur la page).

Sur ces gros volumes, on extrait des textes (par exemple en utilisant en python HTML2TEXT sur certaines parties de page web, ce qui aura pour effet d’enlever déjà toutes les balises HTML), puis enlevertous les signes de type ,:/\!?.

Enfin, faire un split sur ce ces textes, d’abord par ‘.’, puis ensuite par espace. Enfin, ajouter en base de données des groupes de 4 termes successifs, si ils sont non-existants, et sinon, incrémenter leur champ « fréquence » associé.

Par exemple via cette requète :

INSERT INTO table_lettre_a (phrase, freq) VALUES (‘mot1 mot2 mot3 mot4’, 1) ON DUPLICATE KEY UPDATE freq = freq + 1;

Je rajoute que pour stocker ces gros volumes, il aura fallu créer une base de donnée composée de (26+10) tables (une table par première lettre/chiffre de phrase), et ces tables seront composées d’un index, d’une colonne contenant la phrase, et d’une seconde contenant la fréquence.

En terme d’utilisation de l’application :

A chaque fois que l’utilisateur tape une lettre, via un événement javascript onKeyUp on envoie une requète au serveur lui demandant les 10 phrases les plus fréquentes qui commencent par les lettres frappées.

La liste des 10 premières requètes est générée par une requète SQ sur la base associée à la première lettre :

SELECT phrase WHERE phrase LIKE « phrase_source% » ORDER BY freq DESC LIMIT 10;

A chaque nouvelle réponse du serveur, on rafrachit l’iframe sous la barre de recherche contenant les résultats (par exemple via Google Custom Search) avec la requète majoritaire (celle qui vient en premier dans la liste des résultats probables).

On écrit également dans la barre de recherche la fin de la requète (en prenant cette qui est la plus fréquente) et mettant en gras la partie déjà écrite.

Dès que l’utilisateur sort de la page, on met un +1 à la fréquence de la requète prise en compte (si les résultats affichés l’étaient en fonction d’une requète déjà présente en base) ou bien on insère une nouvelle entrée en base si la requète était différente de celles déjà existantes.

C’est tout, dans un premier temps. Si j’ai un peu plus de temps disponible à mon boulot, je tenterais d’en faire une petite application sur AppEngine.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.