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