Discussion:
[Spip] Une suggestion pour la recherche native et/ou le plugin FULLTEXT
eric
2018-04-19 11:36:40 UTC
Permalink
Bonjour,

Un changement du nombre de caractères minimum pour la recherche n'est
pas pris en compte dans recherche_to_array.php.

Actuellement, les mots dont la longueur est <= 3 sont systématiquement
(fulltext ou recherche native) recherchés avec un wildcard.

Une recherche sur un mot de 3 lettres, par exemple, le mois de mai :
renverra maison, domaine ....

recherche_to_array.php
```
//contrôle de la longueur de chaîne à considérer
    $min_long = defined('_RECHERCHE_MIN_CAR') ? _RECHERCHE_MIN_CAR : 4;

// s'il n'y a qu'un mot mais <= 3 lettres, il faut le chercher
avec une *
// ex: RFC => RFC* ; car mysql fulltext n'indexe pas ces mots
if (preg_match('/^\w{1,' . $min_long-1 . '}$/', $recherche)) {
$recherche .= '*';
}
```

Cordialement,

Eric




_______________________________________________
liste spip
***@rezo.net - désabonnement : envoyer un mail à spip-***@rezo.net

Archives : https://www.mail-archive.com/***@rezo.net/maillist.html

Infos : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc
eric
2018-04-19 11:47:58 UTC
Permalink
Post by eric
```
//contrôle de la longueur de chaîne à considérer
    $min_long = defined('_RECHERCHE_MIN_CAR') ? _RECHERCHE_MIN_CAR : 4;
// s'il n'y a qu'un mot mais <= 3 lettres, il faut le chercher
avec une *
// ex: RFC => RFC* ; car mysql fulltext n'indexe pas ces mots
if (preg_match('/^\w{1,' . $min_long-1 . '}$/', $recherche)) {
$recherche .= '*';
}
```
L'ajout d'un tableau, contenant les mots de 3 lettres à considérer,
qu'il serait possible de déclarer dans mes_options.php, serait
également peut-être intéressant ?

Eric
_______________________________________________
liste spip
***@rezo.net - désabonnement : envoyer un mail à spip-***@rezo.net

Archives : https://www.mail-archive.com/***@rezo.net/maillist.html

Infos : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc
Zedd
2018-04-19 13:46:16 UTC
Permalink
Bonjour
Post by eric
Post by eric
```
//contrôle de la longueur de chaîne à considérer
    $min_long = defined('_RECHERCHE_MIN_CAR') ? _RECHERCHE_MIN_CAR : 4;
// s'il n'y a qu'un mot mais <= 3 lettres, il faut le chercher
avec une *
// ex: RFC => RFC* ; car mysql fulltext n'indexe pas ces mots
if (preg_match('/^\w{1,' . $min_long-1 . '}$/', $recherche)) {
$recherche .= '*';
}
```
L'ajout d'un tableau, contenant les mots de 3 lettres à considérer,
qu'il serait possible de déclarer dans mes_options.php, serait
également peut-être intéressant ?
Eric
Je ne sais pas finalement quelle est la demande exacte mais j'ai eu ce
souci sur plusieurs mini moteurs de recherche en Spip pour lesquels
j'avais besoin de trouver de façon plus précise des mots de 3 lettres
(des sigles, des mots comme DVD, CMP, etc ...) et je suis remonté à
mySQL sur divers paramètres comme ft_min_word_len qui permet de définir
la taille mini des mots en index fulltext ... le défaut étant 4 je
suppose que l'* est pour contourner cette limite quand on n'a pas accès
au paramètrage de mySQL.

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_ft_min_word_len

La lecture avait été fort intéressante aussi sur les stopwords (mots
trop courants pas indexés qui arrivent en masse quand on baisse la
taille mini) et sur les résultats ignorés, par ex quand un résultat
retourne plus de 50% des enregistrements sur lesquels on recherche,
c'est ignoré. Cette limite est aussi ajustable, mais ce genre de chose
rend vite fou quand on fait des tests sur une 10aine d'enregistrements
... au delà de 4 résultats c'est ignoré.

Après je ne connais pas forcément le fonctionnement de la recherche spip
donc mes remarques sont peut-être à côté de la plaque. Mais je pense
qu'un paquet de mots de 3 lettres à considérer ne changera rien si
ft_min_word_len est toujours à 4 ?

Pierre
_______________________________________________
liste spip
***@rezo.net - désabonnement : envoyer un mail à spip-***@rezo.net

Archives : https://www.mail-archive.com/***@rezo.net/maillist.html

Infos : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc
c***@azerttyu.net
2018-04-19 14:05:21 UTC
Permalink
Salut

Si on utilises le plugin fulltext , on exploite les fonctionnalités
propres à mysql dont le ft_min_word_len et tout ce qui s'ensuit.

Pour contourner ces limitations soit on se passe de fulltext, soit on
utilise des solutions tierces comme sphinx.

Dans le cas présenté, je dirais qu'il faut se passer de fulltext pour
faire des recherches standards (LIKE et %% de Mysql) et filtrer les
résultats mais c'est moins performants/efficaces.
Autrement si on a la main sur le serveur Mysql, Zedd a déjà donné les pistes :)

Km
_______________________________________________
liste spip
***@rezo.net - désabonnement : envoyer un mail à spip-***@rezo.net

Archives : https://www.mail-archive.com/***@rezo.net/maillist.html

Infos : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc
eric
2018-04-19 14:44:51 UTC
Permalink
Post by c***@azerttyu.net
Si on utilises le plugin fulltext , on exploite les fonctionnalités
propres à mysql dont le ft_min_word_len et tout ce qui s'ensuit.
Pour contourner ces limitations soit on se passe de fulltext, soit on
utilise des solutions tierces comme sphinx.
Dans le cas présenté, je dirais qu'il faut se passer de fulltext pour
faire des recherches standards (LIKE et %% de Mysql) et filtrer les
résultats mais c'est moins performants/efficaces.
Autrement si on a la main sur le serveur Mysql, Zedd a déjà donné les pistes :)
Bonjour,

J'ai déjà configuré ce qu'il faut côté Mysql  pour la prise en compte
des mot de 3 lettres pour la recherche FULLTEXT.

Je fais des tests sur la pertinence des résultats.

J'ai quelques mots de 3 lettres qui doivent être pris en compte tel-
quel, c'est à dire sans l'ajout d'un wildcard lorsque ce terme est
rechercher.

Par défaut, que ce soit avec FULLTEXT ou la méthode native, lorsqu'un
mot a une longueur <=3, le wildcard est systématiquement ajouté, même
si dans mes_options.php, la valeur _RECHERCHE_MIN_CAR est à 3.

Si l'on change cette valeur, c'est que le comportement attendu est le
même que celui en standard pour un mot de 4 lettres.

Par exemple, si j'ai défini _RECHERCHE_MIN_CAR  à 3, je m'attends à ce
que la recherche ce comporte de la même façon lorsque je recherche le
mois de mai ou le mois d'avril. Or, pour l'instant ce n'est pas le cas.

De même que j'ai peut-être connaissance des mots de 3 lettres que je
souhaite prendre en compte.

Dans ce cas, la possibilité d'ajouter cette liste et de changer le
comportement sur l'ajout ou pas du wildcard en fonction de celle-ci
peut-être intéressant.

Cela ne changera pas les index dans le cas d'une recherche FULLTEXT,
mais le classement des résultats.

Un exemple simple avec le mot mai pour une recherche sur les mot clefs
:

- sans prendre en compte la valeur modifiée de _RECHERCHE_MIN_CAR, les
mots clefs mai, domaine, maison ... seront dans la liste des résultats.

- en tenant compte de _RECHERCHE_MIN_CAR, seul le mot-clef mai sera
listé (ou les mots clefs de plusieurs mots comprenant le mot mai). 

SPIP a ce  dernier comportement pour les mots de 4 lettres, mais ne se
comporte pas de la même façon lorsque _RECHERCHE_MIN_CAR est inférieur
à 4 que ce soit avec FULLTEXT ou la recherche native. Cette contrainte
est codée en dur.

Cordialement,

Eric



_______________________________________________
liste spip
***@rezo.net - désabonnement : envoyer un mail à spip-***@rezo.net

Archives : https://www.mail-archive.com/***@rezo.net/maillist.html

Infos : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc
c***@azerttyu.net
2018-04-22 08:55:38 UTC
Permalink
Salut

Ok dans ce cas cela ressemble bien à un bogue :)
Le mieux est d'ouvrir un ticket sur core.spip.org cela permettra un
meilleur suivi.

Km
_______________________________________________
liste spip
***@rezo.net - désabonnement : envoyer un mail à spip-***@rezo.net

Archives : https://www.mail-archive.com/***@rezo.net/maillist.html

Infos : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

Loading...