La limite des 50% sur une recherche FULL TEXT avec Mysql

mardi 17 septembre 2013 :: perrick :: MySQL :: 2 commentaires :: aucun trackback

Un mot qui est trouvé dans la moitié des enregistrements d'une table n'est pas efficace pour trouver les document appropriés. En fait, il trouvera sûrement beaucoup de documents inappropriés à la recherche. On sait tous que cela arrive souvent lorsqu'on recherche quelque chose sur internet en utilisant un moteur de recherche. Extrait de la documentation MySQL pour Recherche en texte intégral (Full-text) dans MySQL

Sauf que dans le cas du petit corpus de questions / réponses que compose la section FAQ d'Opentime et encore plus dans le minuscule corpus généré pour mes tests unitaires, ce seuil de 50% m'a fait arracher les cheveux pendant 2h. Et la solution pour outre-passer cette limitation est sur la page suivante de la documentation : il suffit d'ajouter l'option IN BOOLEAN MODE. Elle permet - entre autres - de ne pas utilise pas le seuil de 50%. Problème : elle ne trie pas automatiquement les lignes par ordre de pertinence décroissante. Heureusement qu'il y a encore d'autres astuces possibles : MySQL match() against() - order by relevance and column.

Trier par pertinence avec MySQL

lundi 14 novembre 2011 :: perrick :: MySQL :: 5 commentaires :: aucun trackback

Ce n'est pas tous les jours que je découvre des petits trucs avec MySQL et la synaxe SQL en général. Alors voici ma dernière production :

SELECT `contact`.* FROM contact WHERE (contact.lastname LIKE '%gra%' OR SOUNDEX(contact.lastname) LIKE SOUNDEX('gra') OR contact.firstname LIKE '%gra%' OR SOUNDEX(contact.firstname) LIKE SOUNDEX('gra') OR contact.company LIKE '%gra%' OR SOUNDEX(contact.company) LIKE SOUNDEX('gra')) LIMIT 0,10

Cette requête permet de sélectionner des contacts en fonction de leur nom, de leur prénom ou de leur entreprise, mais aussi avec une orthographe approchante via la fonction SOUNDEX. Elle marche, elle est en production depuis plusieurs années. Seul problème : le tri, surtout quand on trouve plus de 10 réponses. Comment distinguer facilement les réponses en orthographe précise de celles qui s'en approchent seulement ?

Read next

SkySql se lance dans le grand bain

mercredi 13 octobre 2010 :: perrick :: MySQL :: aucun commentaire :: aucun trackback

Il y a des petites histoires qui font leur chemin... La présence et les discours de Monty (ex-Mysql) lors du Forum PHP 2009 finiraient bien par déboucher sur quelque chose : il y avait eu tellement de petites phrases à l'époque. Désoermais c'est chose faite, SkySQL a ouvert ses portes aujourd'hui... On retrouve aussi dans l'équipe de cette nouvelle société Michael Carney que les visiteurs au Forum connaissent bien : il nous avait présenté plusieurs conférences au fil dans ans.

C'est toujours rigolo de tirer les implications de la présence des uns et des autres lors d'un évènement comme le Forum PHP. Reste à voire quelle sera la surprise pour 2010 !

Et de mon côté il me reste probablement à renommer cette rubrique dans le blog : Databases, Base de données, *SQL ? D'autres idées ??

Le grand saut de l'utf8

vendredi 23 mars 2007 :: perrick :: MySQL :: 3 commentaires :: aucun trackback

Aujourd'hui on fait des ALTER, c'est en tout cas ce que je pensais : UTF8 et MySQL n'étaient -- dans mon esprit -- pas encore en bon terme. Et finalement il aurra suffit d'une boucle pour migrer toutes les tables d'openTIME.

Rigolo comment des passages deviennent naturels parfois : Tout en utf-8 de Laurent, Convertir un site en UTF-8 de Nicolas, détour via PHP/Oracle de Gérald. Et donc notre logiciel de gestion de temps qui a suivi hier le même chemin, pour une sombre histoire de Selenium Server.

C'est dans ces moments-là que je me dis que PHP6 a un bel avenir devant lui : plus de soucis avec urlencode, plus de soucis avec strtoupper. Le bonheur en barre à portée de clavier.

Sage, du côté de MySQL

mercredi 1 novembre 2006 :: perrick :: MySQL :: aucun commentaire :: aucun trackback

Ce n'est pas souvent que je parle de MySQL : c'est une des catégories un peu délaissées de ce blog. Par contre j'ai appris aujourd'hui que Sage va embarquer la base de données open source MySQL. Pour l'instant Sage peut utiliser la technologie MySQL pour l'ensemble de ses produits à travers le monde : reste à savoir quand et si cette migration aura lieu. Vu qu'on travaille régulièrmeent pour des clients qui utilisent ces outils de comptabilité et de gestion, ça pourrait révolutionner notre boulot : une affaire à suivre donc.

Attention à TRUNCATE avec une table Inno DB

vendredi 7 octobre 2005 :: perrick :: MySQL :: 10 commentaires :: aucun trackback

Le truc avec les tests c'est qu'ils sont automatiques et précis. Très précis même. Donc quand ils renvoient un ID avec comme valeur "2" et que moi je m'attendait à une valeur "1", c'est qu'il y a un problème quelque part : une chose est sûr l'insertion de ma valeur dans la table de test ne marche pas comme il faut. Quand bien même tout à l'air de fonctionner dans l'application (un plugin pour openTIME). Après plusieurs tentatives infructueuses pour trouver l'origine du problème, je m'étais résolu -- bien malgré moi -- à accepter cette "fausse valeur".

Aujourd'hui ça recommence pour une nouvelle table : à une différence prêt, nous sommes vendredi soir et la pression de la semaine est tombée quelque peu. En creusant un peu, le problème vient d'un TRUNCATE table qui ne fonctionne pas à tous les coups. Au passage je me rends compte que mes nouvelles tables n'ont pas de type : MySQL par défaut se charge de les créer en Inno DB, alors que dans le reste d'openTIME j'utilise des tables MyISAM. J'ai eu du mal à commencer une recherche dans le manuel de MySQL : je n'ai encore jamais eu à faire à un bug dans des versions "stable". C'est donc choses faite : MySQL Bugs: #11946: truncate does not clear the auto_increment in innodb tables. Et il ne me reste qu'à attendre (et installer) MySQL 5 pour que le bug soit corrigé définitivement.

La doc pas si bien faite de MySQL

mardi 16 novembre 2004 :: perrick :: MySQL :: 3 commentaires :: aucun trackback

Une des règles les plus courantes du développement tient en qq lettres : RTFM (lire le put**n de manuel). Et pourtant je viens de m'arracher les cheveux sur celui de MySQL à cause d'une information manquante et pourtant simple : les fonctions CONVERT et CAST ne sont apparues qu'à partir de la version 4. Si vous avez encore des serveurs qui tournent avec une version 3.23, passer votre chemin.

Un grand merci quand même à la fac d'Amsterdam (il y en a probablement d'autres) qui héberge encore le manuel de référence de MySQL pour sa version 3.23. C'est là que j'ai lu : «we plan to soon introduce casting between different character sets to make string comparison even more flexible».

Pour en revenir à mon problème (ne pas différencier dans ma requête les champs 0 et NULL tout en présent l'information dans la table), j'ai du faire appel à une astuce pas forcément très catholique mais qui a au moins le mérite de marcher : SELECT GREATEST(start, 0) as start FROM table.

PS : c'est dans ces cas-là qu'on se rend compte que la doc de PHP est vraiment très bien foutue.

Trouver le lundi de la semaine en cours

mercredi 22 septembre 2004 :: perrick :: MySQL :: 2 commentaires :: aucun trackback

Cela fait pas mal de temps que je n'ai rien mis dans cette catégorie MySQL alors qu'elle figure en bonne place dans le titre de ce blog : faudra peut-être que j'y fasse quelque chose...

En attendant voici un petit truc pour trouver la date du lundi de la semaine en cours :
SELECT DATE_ADD(CURRENT_DATE, INTERVAL(- DAYOFWEEK(CURRENT_DATE) + 1) DAY).

Et pour la même chose au format timestamp :
SELECT UNIX_TIMESTAMP(DATE_ADD(CURRENT_DATE, INTERVAL(- DAYOFWEEK(CURRENT_DATE) + 1) DAY)).

Comment j'en suis arrivé là ? Tout simplement pour que le script d'installation d'openTIME soit le plus indépendant possible de PHP.

Mise-à-jour du 23/09/2004 : trouver un exemple plus probant de test unitaire en lien avec une base de données ne pouvais pas être plus évident, j'ai donc corrigé la fonction ci-dessus.

Pour un gourou MySQL...

samedi 28 février 2004 :: perrick :: MySQL :: 4 commentaires :: aucun trackback

En avançant dans ma couverture de tests pour openTIME -- toujours grâce à eXtreme Programming, je découvre quelques subtilités de PHP et de MySQL.

Pour mon premier l'analyseur de code PHP qui devrait m'aider à localiser les functions qui ne sont plus utilisés. J'en reparlerai un jour si ça dépasse le stade du carton. A moins qu'un bon outil de refactoring pour PHP sorte ou que quelqu'un me donne une URL intéressante pour découvrir qu'il existe déjà.

Et pour mon second, dans la famille "bug ou feature", un test à réaliser soit même : faire la recherche SELECT * FROM ma_table WHERE id = '1a'; sur une table MySQL 'ma_table' qui contient une colonne id de type int et un seul enregistrement où id = 1. Je suis curieux de savoir pourquoi avec MySQL 4.0.15 et MySQL 3.23.58 je trouve mon enregistrement. Au lieu de rien ?

MySQL et PHP : une explication en cours

mercredi 16 juillet 2003 :: perrick :: MySQL :: 2 commentaires :: aucun trackback

La version 5 de PHP ne contiendra pas de client pour la base de données MySQL : la nouvelle avait surpris pas mal de monde. La raison ? Une incompatibilité de licence entre la GPL (MySQL depuis la version 4) et la BSD (PHP).
Pour y voir plus clair : un entretien entre Zak Greant -- MySQL AB Community Advocate -- et le magazine php | architect.
Via http://dev.nexen.net/news/.

MySQL et SAP : vers le haut ?

lundi 2 juin 2003 :: perrick :: MySQL :: aucun commentaire :: aucun trackback

Bien sûr je me réjouis de voir la fusion entre MySQL et SAP-DB (ou ici - en anglais) : un champ complet de fonctionnalités devrait s'ouvrir pour les développeurs autour de ce nouvelle base de données... Bref ça concorde avec l'impression que MySQL souhaite se faire une place dans le haute-sphère des bases de données "d'entreprises".

Mais parallèlement, SAP fait sa pub dans les gares (à Lille Flandres et Paris Nord au moins) pour les PME/PMI - et non pour les grands comptes : est-ce que ça veut dire que la firme allemande souhaite bénéficier d'une base de données plus simple (et moins chère) pour ses "petits clients" ?

Du MySQL partout

jeudi 27 mars 2003 :: perrick :: MySQL :: aucun commentaire :: aucun trackback

Il n'y pas si longtemps que ça, MySQL n'avait les faveurs des utilisateurs "sérieux". Et depuis quelques temps, ça change.

J'avais d'abord noté que FogBUGZ - le logiciel du Joel de Joel on Software fonctionne aussi sur MySQL. Là Joel appelle ça "transformer ses compléments en biens courants".

Ensuite la version 4.0 de MySQL passe enfin en production avec son lot impressionant de fonctionnalités.

Enfin aujourd'hui, j'apprends que Sage peut faire ses logiciels de comptabilité sous MySQL (là je n'ai pas de liens donc on dira que c'est une "rumeur", en attendant une source directe).

Au fait, mon outil - openTIME - tourne aussi sous MySQL. De là à dire que je suis biaisé, c'est à vous de le penser, ou non ;-)

Optimiser la négation Comparaison entre != et NOT()

lundi 30 décembre 2002 :: perrick :: MySQL :: un commentaire :: aucun trackback

Plongé dans le refactoring d'openTIME, j'en profite pour faire quelques tests sur mes requêtes SQL. Cette fois-ci, il s'agit de comparer "!=" et "NOT()".

Concrètement ça donne :

"SELECT name, user_id FROM project WHERE id != 1"

contre

"SELECT name, user_id FROM project WHERE NOT(id = 1)"

Après un test en local (W2K + Apache 1.3.24 + PHP 4.2.0 + MySQL 3.23.39), puis sur 2 serveurs différents, le résultat est là : "!=", 2,35 s. contre "NOT()", 2,52 s. (moyenne sur 20 éxécutions du script de test). Ce n'est peut-être pas un gain de temps énorme sur les 1000 itérations du code mais c'est toujours ça de pris.

Si vous avez d'autres trucs SQL (ou MySQL), n'hésitez pas à les partager : les commentaires sont là pour ça aussi.

Mais où est donc OR par rapport à IN ?

vendredi 8 novembre 2002 :: perrick :: MySQL :: aucun commentaire :: aucun trackback

Il y a quelques temps en épluchant la doc MySQL je suis tombé sur un "comparison operator" intéressant : IN.

Il peut remplacer OR dans une commande SQL : ainsi

"SELECT name, user_id FROM project WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)"

est équivalent à

"SELECT name, user_id FROM project WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 OR id = 6 OR id = 7 OR id = 8 OR id = 9 OR id = 10"

Et s'il est plus élégant à mon goût - car plus court, il restait une question en suspens : qui est le lièvre et l'autre la tortue ?
Bilan IN gagne là aussi contre OR : 0.986s contre 1.067s sur 1000 itérations.

PS : il s'agit d'un petit test rapide en local (W2K + Apache 1.3.24 + PHP 4.2.0 + MySQL 3.23.39), pas d'un benchmark complet.