Une suggestion pour la recherche native et/ou le plugin FULLTEXT

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

//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

Bonjour

Le 19/04/2018 à 13:47, eric a écrit :

//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

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 :slight_smile:

Km

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 :slight_smile:

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

Salut

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

Km