MariaDB : Faire une recherche FULLTEXT sur plusieurs colonnes simultanément dans une table InnoDB

26 décembre 2016

Pour effectuer une recherche FULLTEXT sur plusieurs colonnes d'une table MariaDB de type InnoDB, une solution peut être de créer à la volée une table MyISAM temporaire qui contiendra l'index permettant d'effectuer la recherche.

Une version simple donnerait quelque chose dans ce goût-là :

public function searchByKeywords($keywords) {
    $sql1 = "CREATE TEMPORARY TABLE article_temp (FULLTEXT INDEX (art_content, art_title )) Engine=MyISAM SELECT * FROM article";

    $sql2 = "SELECT * FROM article_temp WHERE MATCH ( art_content, art_title ) AGAINST ( ? IN BOOLEAN MODE ) ORDER BY art_publish_time DESC";

    $sql3 = "DROP TEMPORARY TABLE article_temp";

    $this->getDb()->exec($sql1);
    $result = $this->getDb()->fetchAll($sql2, array($keywords));
    $this->getDb()->exec($sql3);

    // Faire ce que vous voulez avec $result
    // ...
}

Je n'ai fait aucun benchmark, mais j'imagine qu'il vaut mieux éviter d'utiliser ça sur un site très sollicité et / ou sur des tables contenant beaucoup de données.