Chargement en cours...
Wait
Veuillez patienter
L'opération demandée semble prendre trop de temps.
Attendre 30 secondes de plus   Recharger la page
wait
Connexion
X
Email OU nom d'utilisateur :
Mot de passe :
Se connecter via Google
Créer un compte
Mot de passe oublié ?
Mail d'activation
Langue :
Nouveau sujet
   Retour liste des sujets Retour liste des sujets   Bas de page Bas de page
Sujet n°8956 créé le 04/01/2008 à 17:44 par IceFre@k - Vu 73444 fois par 5993 utilisateurs
   
Pages : 12... 9... 18... 2526272829... 35... 4243
Message n° 3918555, posté à 13:39 le 20/05/2014  
Note
Avatar
McDeneyes
Bonjour
J'ai remarqué qu'il y a un problème avec la fiche série Bones. Elle s'arrête à la saison 5, alors qu'elle vient juste de terminer la 9ème.

Message n° 3918593, posté à 14:49 le 20/05/2014  
Note
Avatar
Sixe
Je viens de vérifier et il y a bien les 9 saisons : fiche série

--
Co-fondateur et administrateur de Subfactory.fr
*édité à 14:50 le 20/05/2014
Message n° 3918595, posté à 14:52 le 20/05/2014  
Note
Avatar
Jujuleder
Normal quand je cherche Akta Manniskor de pas tomber sur la série ? (problème des accents). Si oui je dis rien, si non je rapporte le bug.
Message n° 3918596, posté à 14:55 le 20/05/2014  
Note
Avatar
Sixe
Jujuleder a dit
le 20/05/2014 à 14:52
:

Normal quand je cherche Akta Manniskor de pas tomber sur la série ? (problème des accents). Si oui je dis rien, si non je rapporte le bug.
Oui, c'est bien à cause des accents. Faudra que je regarde si ce n'est pas trop difficile de faire en sorte que ça ne tienne pas compte des accents.

--
Co-fondateur et administrateur de Subfactory.fr
Message n° 3918620, posté à 15:16 le 20/05/2014  
Note
Avatar
Jujuleder
Enfin juste comme ça si je peux proposer, pour chaque série, rajouter un champ dans la Bdd avec le nom de la série avec les accents virés spécialement pour la recherche. Et dans la recherche, virer en javascript les accents avant de lancer la requête.
Après c'est beaucoup de taff pour une fonctionnalité loin d'être primordial, j'en conviens.
Message n° 3918647, posté à 15:34 le 20/05/2014  
+0.60
Note
Avatar
Sixe
J'avais envie de faire un peu comme sur theTVDB.com où ils ont une table dans leur base de données dédiée aux erreurs communes d'écriture d'un nom de série (Genre Dr. Who au lieu de Doctor Who). Cette table pourrait contenir en plus, les noms de séries sans accents et sans apostrophes.

--
Co-fondateur et administrateur de Subfactory.fr
Message n° 3918658, posté à 15:41 le 20/05/2014  
+0.39
Note
Avatar
Bbsiocnarf
Sur un site bien connu, y a des champs d'indexation en DB avec les libellés des titres des séries et des films passés dans plusieurs moulinettes phonétiques + une recherche des termes passés à la même moulinette avec index full texte en MATCH AGAINST + pondération de la pertinence. Ça donne des résultats assez probants :
Ex : /search.html?q=Aqta+Maniscor renvoie en premier Äkta Människor.

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3918659, posté à 15:41 le 20/05/2014  
Note
Avatar
Bbsiocnarf
A ta dispo pour en causer.

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3918736, posté à 16:49 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Alors pour Sixe :
Les grands principes :
Le titre de la série à la création et à chaque édition est traité par la fonction suivante puis stockée dans une table d'indexation avec id serie, champs texte, champs soundex et champ metaphone :
// Fonction qui va transformer une chaine de caractère pour la recherche en match against
function searchFilter($str)
{
$str = utf8_decode($str);
// élément nécéssaire à la recherche des mots composés
$search = array ('@[[:punct:]]@');
$replace = array(' ');
// définition des array utilisé dans les boucles
$arraySpecialChar = array();
$arrayFinal = array();
// On transforme la chaine en tableau
$array = explode(' ',$str);
foreach($array as &$word)
{
$word = trim($word);
// Pour chaque mots, on génère un array en splittant au niveau des caractères spéciaux. On filtre les lignes vides
$arrayWord = array_filter(explode(' ',preg_replace($search, $replace, $word)));
if(count($arrayWord)>1)
{
//Si l'array généré plus haut, comporte plus d'une ligne, ça veut dire qu'on a affaire à un mot composé, on l'ajoute à l'array correspondant
$arraySpecialChar = array_merge($arraySpecialChar,$arrayWord);
}
}
// ON merge l'array de base et l'array des mots composés
$array = array_merge($array,$arraySpecialChar);
unset($word);
// On filtre les mots d'une lettre
foreach($array as $word)
{
if(strlen($word) > 1)
{
$arrayFinal[] = $word;
}
}
sort($arrayFinal);
// On rconstitue la chaine de caractère
$str = implode(' ',$arrayFinal);
// On passe en bas de casse
$str = strtolower($str);
// on flitre les lettre accentuées
$str = utf8_encode($str);
$str = filter($str,' ');
return array('full_text' => phonetique($str,'full_text'), 'soundex' => phonetique($str,'soundex'), 'metaphone' => phonetique($str,'metaphone'), 'boolean' => phonetique($str,'boolean'));
}
A la recherche, les mots recherchés sont passés par la même fonction.
Puis balancés dans une requête de ce type :
$sqlIndex = $db->prepare('SELECT id, type, downloads, '
.'MATCH(full_text) AGAINST (:boolean IN BOOLEAN MODE) AS exact, '
.'( '
.' MATCH(full_text) AGAINST (:fulltext) * 3 + '
.' MATCH(metaphone,soundex) AGAINST (:sound) + '
.' IF(downloads IS NOT NULL,CHAR_LENGTH(downloads),0) '
.') AS pertinence '
.'FROM indexation '
.'WHERE (MATCH(full_text) AGAINST (:fulltext) > 1 '
.' OR MATCH(metaphone,soundex) AGAINST (:sound) > 5) '
.' AND type IN (1,2) '
.'ORDER BY exact DESC, pertinence DESC '
.'LIMIT 0,100');

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
*édité à 17:00 le 20/05/2014
Message n° 3918737, posté à 16:51 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Et voici les fonctions phonetiques et filter :
function phonetique($str,$mode)
{
$array = explode(' ',$str);
foreach($array as &$word)
{
switch($mode)
{
case 'soundex' :
$word = soundex($word);
break;
case 'metaphone' :
$word = metaphone($word);
break;
case 'boolean' :
$word = "+".cleanPluriel($word);
break;
case 'full_text' :
$word = cleanPluriel($word);
break;
}
}
return implode(' ',$array);
}
function filter($in, $sep = '_', $add = "") {
$in = utf8_decode($in);
$pregsep = $sep;
if ( $pregsep == '.' ) $pregsep = '\.';
$search = array ('@[éèêë]@',
'@[ÉÈÊË]@',
'@[àâä]@',
'@[ÀÂÄ]@',
'@[îï]@',
'@[ÎÏ]@',
'@[ûùü]@',
'@[ÛÜÙ]@',
'@[ôö]@',
'@[ÔÖ]@',
'@[ç]@',
'@[Ç]@',
'@[Œ]@',
'@[œ]@',
'@[Æ]@',
'@[æ]@',
'@[ ]@i',
'@[²]@',
'@[^a-zA-Z0-9_'.$pregsep.$add.']@');
$search = array_map("utf8_decode", $search);
$replace = array('e','E','a','A','i','I','u','U','o','O','c','C','OE','oe','AE','ae',$sep,'2','');
$string = preg_replace($search, $replace, $in);
do {
$string = str_replace($sep.$sep, $sep, $string, $count);
} while ( $count > 0 );
return $string;
}

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3918739, posté à 16:52 le 20/05/2014  
Note
Avatar
Sixe
Merci beaucoup Bb, je vais pouvoir m'amuser avec ça cette semaine :)

--
Co-fondateur et administrateur de Subfactory.fr
Message n° 3918743, posté à 16:58 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Décryptage de la requête :
SELECT id,
MATCH(full_text) AGAINST (:boolean IN BOOLEAN MODE) AS exact, // le boolean mode va renvoyer 1 si on a trouvé pile les bon termes (donc de la recherche exacte
(
MATCH(full_text) AGAINST (:fulltext) * 3 +
MATCH(metaphone,soundex) AGAINST (:sound) +
IF(downloads IS NOT NULL,CHAR_LENGTH(downloads),0)
) AS pertinence
// Pertinence, c'est donc un calcul de l'indice de pertinence du truc qu'on a pondéré après des essais en fonction du nombre de DL aussi et en favorisant le full texte de base
FROM indexation
WHERE (MATCH(full_text) AGAINST (:fulltext) > 1 // Donc, les termes sont présent dans la même orthographe
OR MATCH(metaphone,soundex) AGAINST (:sound) > 5) // l'indice de pertinence est supérieur à 5, ce qui laisse penser qu'on est pas loin du truc.
ORDER BY exact DESC, pertinence DESC
LIMIT 0,100;
Ensuite, tu peux jouer avec la requête. Je te conseille tout de même de bien lire la doc de la recherche full texte, c'est toujours intéressant.
Et de penser au param qui permet de prendre en considération les mots de 3 lettres (et moins si tu veux) :
La taille minimale des mots à indexer est définie dans la variable ft_min_word_len de MySQL. See Section 13.5.3.18, « Syntaxe de SHOW VARIABLES ». Vous pouvez modifier cette valeur pour celle que vous préférez, puis reconstruire les index FULLTEXT. (Cette variable n'existe que pour la version 4.0 de MySQL) La valeur par défaut de cette option est de 4 caractères. Modifiez la, puis recompilez les index FULLTEXT. Par exemple, si vous souhaitez pouvoir rechercher des mots de 3 caractères, vous pouvez donner à cette variable la valeur suivante dans le fichier d'options :
[mysqld]
ft_min_word_len=3
Puis, relancez le serveur et recompilez vos index FULLTEXT

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3918745, posté à 16:59 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Sixe a dit
le 20/05/2014 à 16:52
:

Merci beaucoup Bb, je vais pouvoir m'amuser avec ça cette semaine :)
Enjoy !

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3918753, posté à 17:05 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Il manquait ça (c'est juste histoire d'enlever des mots de 3 lettres non pertinents):
function cleanPluriel($word)
{
$arrayExclusion = array(
"es",
"des",
"les",
"mes",
"ces",
"nes",
"ses",
"tes",
"yes"
);
if(!in_array($word,$arrayExclusion))
{
$word = str_replace("s_","",$word."_");
}
return str_replace("_","",$word);
}

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3918764, posté à 17:08 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Ah, et sinon, si un jour tu veux utiliser un vrai moteur de recherche (et ne plus avoir à fermer la recherche en cas de coup de grosse fréquentation), tu peux aussi te documenter par exemple sur SOLR... C'est ce que j'utilise dans mon nouveau taf, et c'est hyper puissant.

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
*édité à 17:09 le 20/05/2014
Message n° 3918775, posté à 17:17 le 20/05/2014  
Note
Avatar
bean
Bbsiocnarf a dit
le 20/05/2014 à 17:08
:

Ah, et sinon, si un jour tu veux utiliser un vrai moteur de recherche (et ne plus avoir à fermer la recherche en cas de coup de grosse fréquentation), tu peux aussi te documenter par exemple sur SOLR... C'est ce que j'utilise dans mon nouveau taf, et c'est hyper puissant.
SOLR qui se fait régulièrement remplacer par elasticsearch maintenant.

--
Julian Delphiki
http://subtitles.toh.info/
Message n° 3918782, posté à 17:23 le 20/05/2014  
Note
Avatar
Bbsiocnarf
Merci du tuyau.

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Message n° 3919943, posté à 21:42 le 21/05/2014  
+0.39
Note
Avatar
Sixe
Bbsiocnarf a dit
le 20/05/2014 à 16:58
:

FROM indexation
WHERE (MATCH(full_text) AGAINST (:fulltext) > 1 // Donc, les termes sont présent dans la même orthographe
OR MATCH(metaphone,soundex) AGAINST (:sound) > 5) // l'indice de pertinence est supérieur à 5, ce qui laisse penser qu'on est pas loin du truc.
ORDER BY exact DESC, pertinence DESC
LIMIT 0,100;
Voilà, j'ai modifié la recherche de séries avec tes fonctions et ta requête.
La recherche se fait sur les noms TVRage, theTVDB et nom français de la série.
J'ai ajouté une condition supplémentaire dans le "WHERE" car il y avait plus cas où la recherche ne donnait rien ou obligeait à taper beaucoup de caractères du nom de la série. Par exemple, la saisie de "zombi" n'affichait par "iZombie" ou "los" n'affichait pas "Lost".
Cette condition est juste
full_text LIKE '%$fulltext%'
.
J'ai aussi personnalisé la "stopword" list en ne mettant dedans que les mots "the" et "les".
Pour finir, dans la fonction "searchFilter()", j'ai ajouté au tout début un preg_replace pour virer tout ce qui est entre parenthèses et le contenu de ces parenthèses.

--
Co-fondateur et administrateur de Subfactory.fr
*édité à 22:28 le 21/05/2014
Message n° 3920000, posté à 22:39 le 21/05/2014  
Note
Avatar
jonsnow
bean a dit
le 20/05/2014 à 17:17
:

SOLR qui se fait régulièrement remplacer par elasticsearch maintenant.
elasticsearch me semble plus recommandé en effet.

--
First lesson : stick them to the pointy end
Message n° 3920003, posté à 22:43 le 21/05/2014  
Note
Avatar
Bbsiocnarf
jonsnow a dit
le 21/05/2014 à 22:39
:

elasticsearch me semble plus recommandé en effet.
On est en train d'en causer...
Elasticsearch, ca permet d'indexer des champs multivalués aussi ?

--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
*édité à 22:52 le 21/05/2014
Pages : 12... 9... 18... 2526272829... 35... 4243
Liste des sujets \ Fiches séries : Questions/Suggestions

L'envoi de messages anonymes est désactivé. Veuillez vous connecter pour poster un message : Connexion
.