[SPIP Zone] Plugin Indexation, table spip_dico, etc.

Bonjour,

J'avais mis en oeuvre une assistance à la recherche -- type Google Suggest -- sur un SPIP 1.9.2 grâce à la table spip_dico, qui a malheureusement disparu en version SVN.

J'ai regardé le plugin Indexation pour voir s'il pouvait m'aider, mais je n'ai pas complètement compris ce qu'il fait, et l'exemple fourni (exemple.html) plante à cause d'un filtre de RechercheEtendue. Ce plugin n'a pas l'air de pouvoir m'aider à retrouver une table spip_mots.

Indexation permet de récupérer un extrait "autour" du terme cherché, donc j'aurais pu faire une recherche et prendre juste un seul mot en extrait, mais le plugin ne sait apparemment chercher que sur un mot complet. Par exemple, une recherche sur "bou" ne me retourne pas des articles contenant le mot "boucle".

Une idée ?

-Nicolas

--
Nicolas "Brush" HOIZEY
Clever Age : http://www.clever-age.com/
Gastero Prod : http://www.gasteroprod.com/
Photos : http://www.flickr.com/gp/38608514@N00/M1c002

Nicolas Hoizey a écrit :

Bonjour,

J'avais mis en oeuvre une assistance à la recherche -- type Google Suggest -- sur un SPIP 1.9.2 grâce à la table spip_dico, qui a malheureusement disparu en version SVN.

Tu parles de spip_index_dico ? (qui a disparu en 1.9.3) ou de spip_ortho_dico (qui a aussi disparu en 1.9.3).

spip_ortho_dico redevient accessible via le plugin ortho.

Pour spip_index_dico, voir ce que donne le plugin indexation

Cordialement

J'avais mis en oeuvre une assistance à la recherche -- type Google Suggest -- sur un SPIP 1.9.2 grâce à la table spip_dico, qui a malheureusement disparu en version SVN.

Tu parles de spip_index_dico ? (qui a disparu en 1.9.3) ou de spip_ortho_dico (qui a aussi disparu en 1.9.3).

spip_index_dico, oui, pardon.

spip_ortho_dico redevient accessible via le plugin ortho.

Non, je n'utilise quasiment pas le serveur d'ortho depuis que ça se fait tout seul dans Firefox...

Et de toute façon je suppose qu'il contient un dictionnaire limité aux termes que l'on a ajouté par rapport à une référence, pas tous les mots des contenus, donc ça ne me serait d'aucune utilité.

Pour spip_index_dico, voir ce que donne le plugin indexation

C'est justement ce que je voulais faire, mais je n'ai pas l'impression que cela puisse m'aider.

-Nicolas

--
Nicolas "Brush" HOIZEY
Clever Age : http://www.clever-age.com/
Gastero Prod : http://www.gasteroprod.com/
Photos : http://www.flickr.com/gp/38608514@N00/M1c002

Tu parles de spip_index_dico ? (qui a disparu en 1.9.3) [...]

En attendant de voir comment récupérer cette table bien pratique, j'ai bricolé vite fait une solution transitoire, qui n'est pas satisfaisante pour plusieurs raisons :

- C'est fait à la volée avec une requête SQL sur la table spip_articles utilisant un LIKE dans le WHERE, donc clairement pas performant s'il y a trop d'articles.

- Vu que ça n'utilise que spip_articles, ça ne récupère pas les mots des autres contenus, même s'ils sont liés aux articles (docs, auteurs, mots clefs, etc.). Il « suffirait » d'ajouter des jointures, mais les perfs s'effondreraient.

- C'est un LIKE sur une concaténation des champs de l'article, donc pas de notion de poids (d'importance relative) en fonction du champ où c'est trouvé, c'est juste un compte du nombre d'occurrences.

- Je n'arrive pas à gérer les mots avec des caractères accentués, et je ne pense pas de toute façon que ça gère bien les caractères non iso-latin en général

- Etc.

[(#HTTP_HEADER{Content-type: text/plain[; charset=(#CHARSET)]})]
<?php
include_spip('inc/charsets');
include_spip('inc/texte');
include_spip('base/abstract_sql');

if(strlen(trim($_REQUEST['q'])) > 1) {
  $query = strtolower(translitteration(trim($_REQUEST['q'])));
  $qSelect = "LOWER(CONCAT(surtitre, ' ', titre, ' ', soustitre, ' ', descriptif, ' ', chapo, ' ', texte, ' ', ps)) texte";
  $qFrom = "spip_articles";
  $qWhere = "texte LIKE '%".$query."%' AND statut='publie'";
  $res = sql_select($qSelect, $qFrom, $qWhere);
  if (sql_count($res)) {
    $mots = array();
    while($row = sql_fetch($res)) {
      $texte = " ".$row['texte']." ";
      $texte = preg_replace(',<.*>,Ums',' ',$texte); // Suppression des balises
      $texte = strtolower(translitteration($texte));
      $texte = ereg_replace("[^-'a-z0-9]+", " ", $texte);
      $texte = ereg_replace("-*([a-z0-9]+-?[a-z0-9]+)-*", "\\1", $texte);
      $texte = ereg_replace("[a-z0-9]+-[-a-z0-9]+-[a-z0-9]+", "", $texte);
      $texte = str_replace(array(" l'", " d'", " j'", " c'", " s'", "n'", "qu'"), " ", $texte);
      $texte = ereg_replace(" +", " ", $texte);
      $motsTexte = explode(' ', $texte);
      foreach($motsTexte as $mot) {
        if (ereg($query, $mot)) {
          if (isset($mots[$mot])) {
            $mots[$mot]++;
          } else {
            $mots[$mot] = 1;
          }
        }
      }
    }
    // On inverse les cles (mot) et les valeurs (nb articles)
    $mots = array_flip($mots);
    // On tri par clef (nb articles)
    krsort($mots);
    spip_log($query.' -> '.print_r($mots, true), 'livesearch');
    // On ne garde que les 10 + pertinents
    $mots = array_slice($mots, 0, 10);
    foreach($mots as $mot) {
      echo $mot."\n";
    }
  }
}
?>

-Nicolas

--
Nicolas "Brush" HOIZEY
Clever Age : http://www.clever-age.com/
Gastero Prod : http://www.gasteroprod.com/
Photos : http://www.flickr.com/gp/38608514@N00/M1c002

Tu parles de spip_index_dico ? (qui a disparu en 1.9.3) [...]

En attendant de voir comment récupérer cette table bien pratique, j'ai bricolé vite fait une solution transitoire, qui n'est pas satisfaisante pour plusieurs raisons :

- C'est fait à la volée avec une requête SQL sur la table spip_articles utilisant un LIKE dans le WHERE, donc clairement pas performant s'il y a trop d'articles.

- Vu que ça n'utilise que spip_articles, ça ne récupère pas les mots des autres contenus, même s'ils sont liés aux articles (docs, auteurs, mots clefs, etc.). Il « suffirait » d'ajouter des jointures, mais les perfs s'effondreraient.

- C'est un LIKE sur une concaténation des champs de l'article, donc pas de notion de poids (d'importance relative) en fonction du champ où c'est trouvé, c'est juste un compte du nombre d'occurrences.

- Je n'arrive pas à gérer les mots avec des caractères accentués, et je ne pense pas de toute façon que ça gère bien les caractères non iso-latin en général

- Etc.

[(#HTTP_HEADER{Content-type: text/plain[; charset=(#CHARSET)]})]
<?php
include_spip('inc/charsets');
include_spip('inc/texte');
include_spip('base/abstract_sql');

if(strlen(trim($_REQUEST['q'])) > 1) {
  $query = strtolower(translitteration(trim($_REQUEST['q'])));
  $qSelect = "LOWER(CONCAT(surtitre, ' ', titre, ' ', soustitre, ' ', descriptif, ' ', chapo, ' ', texte, ' ', ps)) texte";
  $qFrom = "spip_articles";
  $qWhere = "texte LIKE '%".$query."%' AND statut='publie'";
  $res = sql_select($qSelect, $qFrom, $qWhere);
  if (sql_count($res)) {
    $mots = array();
    while($row = sql_fetch($res)) {
      $texte = " ".$row['texte']." ";
      $texte = preg_replace(',<.*>,Ums',' ',$texte); // Suppression des balises
      $texte = strtolower(translitteration($texte));
      $texte = ereg_replace("[^-'a-z0-9]+", " ", $texte);
      $texte = ereg_replace("-*([a-z0-9]+-?[a-z0-9]+)-*", "\\1", $texte);
      $texte = ereg_replace("[a-z0-9]+-[-a-z0-9]+-[a-z0-9]+", "", $texte);
      $texte = str_replace(array(" l'", " d'", " j'", " c'", " s'", "n'", "qu'"), " ", $texte);
      $texte = ereg_replace(" +", " ", $texte);
      $motsTexte = explode(' ', $texte);
      foreach($motsTexte as $mot) {
        if (ereg($query, $mot)) {
          if (isset($mots[$mot])) {
            $mots[$mot]++;
          } else {
            $mots[$mot] = 1;
          }
        }
      }
    }
    // On inverse les cles (mot) et les valeurs (nb articles)
    $mots = array_flip($mots);
    // On tri par clef (nb articles)
    krsort($mots);
    spip_log($query.' -> '.print_r($mots, true), 'livesearch');
    // On ne garde que les 10 + pertinents
    $mots = array_slice($mots, 0, 10);
    foreach($mots as $mot) {
      echo $mot."\n";
    }
  }
}
?>

-Nicolas

--
Nicolas "Brush" HOIZEY
Clever Age : http://www.clever-age.com/
Gastero Prod : http://www.gasteroprod.com/
Photos : http://www.flickr.com/gp/38608514@N00/M1c002