McDeneyes
Sujet n°8956 créé le 04/01/2008 à 17:44 par IceFre@k - Vu 73444 fois par 5993 utilisateurs
Sixe
Je viens de vérifier et il y a bien les 9 saisons : fiche série
--
Co-fondateur et administrateur de Subfactory.fr
Co-fondateur et administrateur de Subfactory.fr
*édité à 14:50 le 20/05/2014
Sixe
Jujuleder a dit
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.
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
Co-fondateur et administrateur de Subfactory.fr
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
Co-fondateur et administrateur de Subfactory.fr
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 :
--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Bbsiocnarf
--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Bbsiocnarf
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 againstfunction 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'));}
$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
-= 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
Bbsiocnarf
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
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
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=3Puis, 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
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Bbsiocnarf
Sixe a dit
Merci beaucoup Bb, je vais pouvoir m'amuser avec ça cette semaine :)
le 20/05/2014 à 16:52
:Merci beaucoup Bb, je vais pouvoir m'amuser avec ça cette semaine :)
--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Bbsiocnarf
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
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
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
-= 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
bean
Bbsiocnarf a dit
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.
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.
Bbsiocnarf
--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
Sixe
Bbsiocnarf a dit
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;
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;
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%'.
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
Co-fondateur et administrateur de Subfactory.fr
*édité à 22:28 le 21/05/2014
jonsnow
bean a dit
SOLR qui se fait régulièrement remplacer par elasticsearch maintenant.
le 20/05/2014 à 17:17
:SOLR qui se fait régulièrement remplacer par elasticsearch maintenant.
--
First lesson : stick them to the pointy end
First lesson : stick them to the pointy end
Bbsiocnarf
jonsnow a dit
elasticsearch me semble plus recommandé en effet.
le 21/05/2014 à 22:39
:elasticsearch me semble plus recommandé en effet.
Edit : apparemment, oui : http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_multi_value_fields_2.html
--
-= Lok & NorBAC & Strike Team: Our Gang & La Fabrique =-
-= Showtime: The Best Shit on TV =-
-= I am here because of Ashley. =-
www.subfactory.fr
-= 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
Liste des sujets \ Fiches séries : Questions/Suggestions
L'envoi de messages anonymes est désactivé. Veuillez vous connecter pour poster un message :