utilisation limite du moteur de recherche

Bonjour à tous,

j'ai une question pour les pros du moteur de recherche :

Sur un site de publication scientifique en SHS, j'en fait une utilisation particulière :

- les textes publiés contiennent un grand nombre de références bibliographiques dans le texte se présentant comme suit : [Claud.Rapt.Pros.3,270-275] ou [Ov.Met.11,410-572]
- mon problème a été de créer des index à partir de ces références
- j'ai donc créé des mots-clés : 1 par oeuvre avec comme titre [Ov.Met] et dans le champ texte du mot-clé, l'ensemble des références sans crochet et séparées par des espaces.
- dans mes_fonctions, j'ai créé un script qui, sur chacune des références, met un lien passant la référence comme variable de recherche pour le moteur.
- Donc, quand on clique sur une référence complète à partir de l'index, on a une requête du type :
recherche_reference.php3?recherche=Ov.Met.11,410-572
- Notez qu'à l'intérieur de chaque référence il n'y a aucun espace, mais des points et des virgules que je ne peux pas enlever. Idem pour les références à l'intérieur du texte. Par contre, à l'intérieur du texte, on a "espace[référence_sans_espace]espace"
- Les résultats maintenant : le système marche très bien en général : il me sort l'article et uniquement l'article où la référence est présente. Mais pour un certain nombre de références, notamment celles où il y a plusieurs points (Claud.Rapt.pros. est typique), ce n'est pas le cas : il me sort aussi les autres articles. Pire, si je fais un classement {par points}, il me les sort dans le mauvais ordre. (???)

Ma question est donc : pourquoi ça marche sur certaines références et pas d'autres ? Je soupçonne le rôle des points là dedans car lorsque je fais une requête test en supprimant les points, ça marche (alors que la référence sans point n'existe pas dans le texte). J'imagine que les points sont identifiés par inc_index comme séparateurs de mots. Puis-je désactiver cela, sans conséquence pour le moteur de recherche texte intégral que j'utilise aussi ? et comment ?

Si vous avez la bonté de me faire des suggestions, sachez que la même référence peut être présente dans plusieurs textes. Je ne peux donc limiter le résultat de la requête à un seul résultat (tricherie que j'utilise actuellement parce que de fait, ce n'est pas encore le cas). Par ailleurs, je répète que les mots-clés sont totalement artificiels, qu'ils ne sont attachés à aucun article et ne servent qu'à présenter l'index. Après, on passe par le moteur de recherche. Je ne peux pas les utiliser directement par attachement car je peux avoir deux textes qui contiennent une référence aux Métamorphoses d'Ovide [Ov. Met. qqchose...] mais pas nécessairement les mêmes références précises ; c'est même très souvent le cas.

Bon, je sais, que je fais une utilisation très limite de Spip. Mais l'expérience prouve que ça marche sur 80% des références. Il doit être possible d'avoir un résultat de 100%.

Merci beaucoup à tous ceux qui se pencheront sur ce casse-tête chpipnois.

Pierre Mounier

Salut,

En fait ton utilisation du moteur de recherche est un pis-aller puisque
tu sais que tu veux un résultat unique, et totalement déterministe.

Je te propose une autre approche, qui demandera un peu de compétences,
mais à mon avis plus satisfaisante :

- modifier ton filtre pour qu'il renvoie les requêtes vers un couple de
squelettes particulier : par exemple reference.php3?ref=Ov.Met

- créer un nouveau inc-urls-toto.php3 afin de récupérer le "ref" et
le transformer en "id_mot" ; le mode d'emploi est indiqué au début de
inc-urls-dist.php3 : il faut ajouter à la fonction recuperer_parametres_url
le morceau de code nécessaire, du genre :

function recuperer_parametres_url($fond, $url) {
  global $contexte;
        if ($fond == "reference" and $GLOBALS['ref']) {
             $titre = addslashes($GLOBALS['ref']);
             $query = "SELECT id_mot FROM spip_mots WHERE titre = '$titre'";
             $result = spip_query($query);
             if ($row = spip_fetch_array($result)) {
                     $contexte['id_mot'] = $row['id_mot'];
             }
        }
  return;
}

Ainsi dans le squelette reference.html, tu pourras écrire simplement
une boucle mots-clés ( <BOUCLE_mots(MOTS) {id_mot}> ) qui utilisera
automatiquement l'id_mot correspondant au "ref" passé dans l'URL.

Ensuite, il faut configurer inc-urls.php3 pour utiliser inc-urls-toto,
et vérifier que cela marche (c'est-à -dire que reference.php3?ref=mon_titre
affiche bien un mot-clé si "mon_titre" est un titre de mot-clé existant).

Plusieurs avantages :

- tu simplifies le travail de saisie (pas besoin de saisir les
références croisées à la main dans le texte du mot-clé pour
faire "tilter" le moteur de recherche)

- les résultats sont garantis (au contraire du moteur de recherche)

- le moteur n'étant pas sollicité, les pages s'affichent plus vite

Plus tard, si cette méthode marche, tu pourras enjoliver les URLs
à l'aide d'un système de "rewrite rules", par exemple renvoyer les
références vers www.monsite.com/ref/Ov.Met, qui lui-même sera redirigé
vers reference.php3?ref=Ov.Met

Amicalement

Antoine.

A 17:40 15/05/2003, Antoine a écrit :

Salut,

Je te propose une autre approche, qui demandera un peu de compétences,
mais à mon avis plus satisfaisante :
...
Amicalement

Antoine.

Oh l'autre,...il a des cours particuliers du maître ;o))

Stef

Antoine,

Merci de ton conseil. Mais je me suis mal fait comprendre : mon problème n'est pas de
trouver des références que je ne connaîtrais pas, mais au contraire, d'obtenir une liste
d'articles qui contiennent des références connues. J'ai un problème de nombres : une
centaine de références par article ; je ne peux donc pas entrer un mot-clé par référence
; et en même temps, puisque je dois afficher pour les visiteurs du site l'ensemble des
références présentes sur le site (un index quoi), je décompose en deux temps : #TITRE
d'un mot-clé générique pour une oeuvre en général (Les Métamorhoses) et
#TEXTE|mon_filtre_qui_fabrique_une_requête pour la liste de toutes les références
précises présentes quelque part dans le site. J'ai donc indexé manuellement chaque
article en extrayant l'ensemble des références présentes dans les articles et en les
ayant entrées dans le champ texte des mots-clés. L'utilisateur clique ensuite sur un des
items de la liste qui va lancer une requête de type
recherche.php3?recherche=Ov.Met.2,31 (et non pas simplement Ov.Met qui est trop
imprécis). Je veux juste ensuite qu'il me sorte la liste des articles où Ov.Met,2,31
exactement soit présent. Ce qui me permet en plus d'utiliser spip_surligne un peu
customisé pour mettre des ancres qui positionnent l'écran sur la première occurrence de
la référence dans le texte et surligne les autres. C'est absolument nécessaire dans la
mesure où les articles font jusqu'à 60 pages Word.

Mon utilisation des mots-clés et du moteur est limite, mais pas originale : les mots-clés
fabriquent des index manuels et le moteur dont les critères sont contraints par la liste
manuelle d'index cherche les articles où l'entrée d'index est présente. Je sais
qu'idéalement je devrais utiliser l'attribuation de mots-clés aux articles pour retrouver
les articles à partir d'une liste de mots-clés. Mais là j'en ai tout simplement trop ; je dois
donc grouper les références dans un mot-clé générique et permettre à l'utilisateur de
lancer une requête par moteur de recherche sur chacun des items de la liste. Il faut
juste que le moteur me fasse une recherche exacte sur l'ensemble de la référence sans
la décomposer en Ov+Met+2+31. Manifestement, il garde l'intégralité sur la plupart des
références, mais pas sur toutes.

Amitiés,

P. Mounier

On 15 May 2003 at 17:40, Antoine wrote:

Salut,

En fait ton utilisation du moteur de recherche est un pis-aller puisque
tu sais que tu veux un résultat unique, et totalement déterministe.

Je te propose une autre approche, qui demandera un peu de compétences,
mais à mon avis plus satisfaisante :

- modifier ton filtre pour qu'il renvoie les requêtes vers un couple de
squelettes particulier : par exemple reference.php3?ref=Ov.Met

- créer un nouveau inc-urls-toto.php3 afin de récupérer le "ref" et
le transformer en "id_mot" ; le mode d'emploi est indiqué au début de
inc-urls-dist.php3 : il faut ajouter à la fonction recuperer_parametres_url
le morceau de code nécessaire, du genre :

function recuperer_parametres_url($fond, $url) {
  global $contexte;
        if ($fond == "reference" and $GLOBALS['ref']) {
             $titre = addslashes($GLOBALS['ref']);
             $query = "SELECT id_mot FROM spip_mots WHERE titre = '$titre'";
             $result = spip_query($query);
             if ($row = spip_fetch_array($result)) {
                     $contexte['id_mot'] = $row['id_mot'];
             }
        }
  return;
}

Ainsi dans le squelette reference.html, tu pourras écrire simplement
une boucle mots-clés ( <BOUCLE_mots(MOTS) {id_mot}> ) qui utilisera
automatiquement l'id_mot correspondant au "ref" passé dans l'URL.

Ensuite, il faut configurer inc-urls.php3 pour utiliser inc-urls-toto,
et vérifier que cela marche (c'est-à-dire que reference.php3?ref=mon_titre
affiche bien un mot-clé si "mon_titre" est un titre de mot-clé existant).

Plusieurs avantages :

- tu simplifies le travail de saisie (pas besoin de saisir les
références croisées à la main dans le texte du mot-clé pour
faire "tilter" le moteur de recherche)

- les résultats sont garantis (au contraire du moteur de recherche)

- le moteur n'étant pas sollicité, les pages s'affichent plus vite

Plus tard, si cette méthode marche, tu pourras enjoliver les URLs
à l'aide d'un système de "rewrite rules", par exemple renvoyer les
références vers www.monsite.com/ref/Ov.Met, qui lui-même sera redirigé
vers reference.php3?ref=Ov.Met

Amicalement

Antoine.

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.uzine.net/spip