Statistiques sur l’utilisation du moteur de recherche

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Vous avez envie de savoir ce que les visiteurs de votre site web y cherchent. Voici une contribution qui devrait vous y aider.

Connaître les utilisateurs d’un site web et leurs attentes — sans pour autant se tranformer en espion pervers qui constelle son site de mouchards ni assomer ses visiteurs à coups de questionnaires « que pensez-vous de notre site ? ») — est le désir de tout webmaster. Un bon moyen de cerner les attentes de ses visiteurs est sans doute de connaître les requêtes qu’ils font dans le moteur de recherche interne d’un site.

Les quelques lignes de code que nous proposons ici rempliront deux fonctions : générer une liste des requêtes les plus usitées sur le site et fournir le nombre total de requêtes effectuées dans le moteur de recherche.

1. Créer une nouvelle table

Nous allons commencer par créer une nouvelle table qui contiendra les « logs » du moteur de recherche.

CREATE TABLE spip_recherche (
requete varchar(255) NOT NULL,
compteur INTEGER NOT NULL
);

2. Le script qui va faire le travail

Nous allons ensuite créer un petit fichier, que nous appelerons par exemple stats_recherche.php3 qui effectuera le travail de comptage.

<?php

# On se connecte à la base de données (en chargeant au passage les fonctions nécessaires à la suite)
require("ecrire/inc_version.php3");
require("ecrire/inc_connect.php3");

# On nettoye la requête (on enlève les accents, on vire les espaces superflus et on passe tout en minuscules)
$requete = strtolower(trim(strtr($recherche,
"ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜàâãäåçèéêëìíîïòóôõöùúûüÿ",
"AAAAAACEEEEIIIIOOOOOUUUUaaaaaceeeeiiiiooooouuuuy")));

# On checke si l'entrée est déjà présente dans la table
$resultat_total = spip_query_db("SELECT count(*) as qte FROM spip_recherche WHERE requete='$requete'");
$total = @mysql_result($resultat_total,"0","qte");

# Si oui, on incrémente le compteur
if($total>0)
{
spip_query_db("UPDATE spip_recherche SET compteur = compteur + 1 WHERE requete='$requete'");
}

# Si non, on ajoute l'entrée dans la table
else
{
spip_query_db("INSERT INTO spip_recherche(requete,compteur) VALUES('$requete','1')");
}

?>

Il ne reste plus qu’à l’appeler en intégrant la ligne suivante dans le squelette de recherche :

<?php include("stats_recherche.php3"); ?>

3. Afficher les résultats

Les statistiques sont désormais disponibles dans la base de données. On pourra les appeler en PHP, par exemple pour générer la liste des 50 requêtes les plus demandées dans le moteur de recherche :

<?php

# On se connecte à la base de données (en chargeant au passage les fonctions nécessaires à la suite)
require("ecrire/inc_version.php3");
require("ecrire/inc_connect.php3");

# Requete sur la base de données
$r = spip_query_db("SELECT * FROM spip_recherche ORDER BY compteur DESC LIMIT 50");
while($o = mysql_fetch_object($r)) {
print($o->requete." (".$o->compteur.")<br>"); }

?>

Pour connaître le nombre total de requêtes effectuées dans le moteur de recherche, il suffira de sommer tous les compteurs :

<?php

# On se connecte à la base de données (en chargeant au passage les fonctions nécessaires à la suite)
require("ecrire/inc_version.php3");
require("ecrire/inc_connect.php3");

$compteur = 0;
# Requete sur la base de données
$r = spip_query_db("SELECT SUM(compteur) as total FROM spip_recherche");
$o = mysql_fetch_object($r);
print("Nombre de requêtes :".$o->total);

?>

Pour conclure

Tout ceci est un ersatz vraiment très sommaire de ce à quoi pourrait ressembler un module de stats sur le moteur de recherche. Pas mal d’améliorations devraient être faites (intégrer ça dans l’espace privé de SPIP notamment) : si certains ont envie de s’y coller, je les y encourage vivement.

Discussion

Une discussion

  • J’apporte ma petite contribution. J’ai remarqué en effet que les stats étaients faussées parce que souvent le visiteur fait une recherche, va sur un des résultats, puis revient sur la page précédente. Cela a pour effet de faire fonctionner plusieurs fois le script et donc d’enregistre plus de recherches qu’il n’en faut.

    J’ai donc rajouté une colonne qui enregistre la dernière ip qui a fait une recherche et fait une comparaison supplémentaire. Je vous laisse le code si ça intéresse quelqu’un.

    Pour créer la table :

    CREATE TABLE spip_recherche (
    requete varchar(255) NOT NULL,
    compteur INTEGER NOT NULL,
    ip int(10) unsigned default 0,
    );

    Le script modifié :

    <?php
    
    # On se connecte à la base de données (en chargeant au passage les fonctions nécessaires à la suite)
    require("ecrire/inc_version.php3");
    require("ecrire/inc_connect.php3");
    
    # On nettoye la requête (on enlève les accents, on vire les espaces superflus et on passe tout en minuscules)
    $requete = strtolower(trim(strtr($recherche,
    "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜàâãäåçèéêëìíîïòóôõöùúûüÿ",
    "AAAAAACEEEEIIIIOOOOOUUUUaaaaaceeeeiiiiooooouuuuy")));
    
    # On récupère l'adresse ip du visiteur 
    
    	if ($GLOBALS['HTTP_X_FORWARDED_FOR'])
    		$ip_visiteur = $GLOBALS['HTTP_X_FORWARDED_FOR'];
    	else
    		$ip_visiteur = $GLOBALS['REMOTE_ADDR'];
    
    	
    	// Conversion IP 4 octets -> entier 32 bits
    	if (ereg("^(::ffff:)?([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$", $ip_visiteur, $r)) {
    		$ip_visiteur = sprintf("0x%02x%02x%02x%02x", $r[2], $r[3], $r[4], $r[5]);
    	}
    	else return;
    	
    
    
    # On checke si l'entrée est déjà présente dans la table
    $resultat_total = spip_query_db("SELECT count(*) as qte FROM spip_recherche WHERE requete='$requete'");
    $total = @mysql_result($resultat_total,"0","qte");
    
    # Si oui, on récupère la dernière ip
    if($total>0)
    {
    $resultat_ip = spip_query_db("SELECT ip as ip FROM spip_recherche WHERE requete='$requete'");
    $derniere_ip = @mysql_result($resultat_ip,"0","ip");
    
    # Si les adresses sont différentes, on met à jour, sinon on ne fait rien
    if ($derniere_ip != hexdec($ip_visiteur))
    	{
    	spip_query_db("UPDATE spip_recherche SET compteur = compteur + 1, ip = $ip_visiteur  WHERE requete='$requete'");
    
    	}
    }
    
    # Si l'entrée n'est pas présente dans la base, on ajoute l'entrée dans la table
    else
    {
    spip_query_db("INSERT INTO spip_recherche(requete,compteur,ip) VALUES('$requete','1', $ip_visiteur)");
    }
    
    ?>

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom