<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.grafactory.net/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>L'appartement - fulltext</title>
  <link>http://www.grafactory.net/blog/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Sun, 24 Aug 2008 20:09:44 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Recherche Fulltext et InnoDB avec Mysql</title>
    <link>http://www.grafactory.net/blog/post/2007/09/07/Recherche-Fulltext-et-InnoDB-avec-Mysql</link>
    <guid isPermaLink="false">urn:md5:c70ad4563922462c4b58283621606501</guid>
    <pubDate>Mon, 10 Sep 2007 11:22:00 +0200</pubDate>
    <dc:creator>Yves Tannier</dc:creator>
        <category>Le codage</category>
        <category>fulltext</category><category>innodb</category><category>mysql</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://www.grafactory.net/blog/public/images/icones/mysql_100x52-64.gif&quot; alt=&quot;Logo Mysql&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;Les avantages de l'utilisation du moteur de stockage &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/innodb-overview.html&quot; hreflang=&quot;fr&quot;&gt;InnoDB&lt;/a&gt; par rapport à &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/myisam-storage-engine.html&quot; hreflang=&quot;fr&quot;&gt;MysIsam&lt;/a&gt; sur une base de données &lt;a href=&quot;http://www.mysql.fr/&quot; hreflang=&quot;fr&quot;&gt;Mysql&lt;/a&gt; (à partir de la version 5.02) sont non négligeables sur certains projets. Il permet l'utilisation&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;de contraintes d'intégrité (Foreign Key ect...)&lt;/li&gt;
&lt;li&gt;de &lt;em&gt;triggers&lt;/em&gt; (déclencheurs en français dans le texte).&lt;/li&gt;
&lt;li&gt;de procédures stockées&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un inconvénient est, par contre, particulièrement pénalisant dès qu'on envisage un moteur de recherche en &quot;texte intégral&quot;. Il est en effet impossible de créer des &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html&quot; hreflang=&quot;fr&quot;&gt;index FULLTEXT&lt;/a&gt; avec le moteur InnoDB&amp;nbsp;! L'utilisation des MATCH et autres joyeusetés est donc impossible. Le classement pertinent des résultats devient plus compliqué à mettre en oeuvre.&lt;/p&gt;


&lt;p&gt;Je me suis retrouvé confronté à ce problème récemment et voici comment je l'ai contourné. Je résume, pour l'exemple, en une unique table, ma structure de données qui en compte quelques dizaines.&lt;/p&gt;


&lt;p&gt;J'ai donc une table &quot;texts&quot; qui utilise InnoDB avec quelques champs dont le &quot;title&quot; sur lequel je souhaite faire les recherches (la clé primaire s'appelle &quot;idtext&quot;).&lt;/p&gt;


&lt;p&gt;J'ai créé une table &quot;searchs_texts&quot; avec le moteur MyIsam, deux champs -   idtext/title - &lt;strong&gt;et&lt;/strong&gt; un index FULLTEXT sur le champ &quot;title&quot;.&lt;/p&gt;


&lt;p&gt;Cette table contient, vous l'aurez compris, l'exacte correspondance des champs idtext/title de la table texts.&lt;/p&gt;


&lt;p&gt;Reste à tenir à jour cette table sans modifier le code de tous le site. Les &lt;strong&gt;triggers&lt;/strong&gt; vont nous être bien utile pour ça&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Un pour l'INSERT&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
CREATE TRIGGER trigger_insert_texts
AFTER INSERT ON texts
FOR EACH ROW
INSERT INTO searchs_texts SET idtext=NEW.idtext, title=NEW.title;
&lt;/pre&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Un pour l'UPDATE&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
CREATE TRIGGER trigger_update_texts
AFTER UPDATE ON texts
FOR EACH ROW
UPDATE searchs_texts SET title=NEW.title WHERE idtext=OLD.idtext;
&lt;/pre&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Et enfin, un pour le DELETE&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
CREATE TRIGGER trigger_delete_texts
AFTER DELETE ON texts
FOR EACH ROW
DELETE FROM searchs_texts WHERE idtext=OLD.idtext;
&lt;/pre&gt;


&lt;p&gt;Et voilà. Le tour est joué&amp;nbsp;! Maintenant, votre moteur de recherche pourra utiliser &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/fulltext-boolean.html&quot; hreflang=&quot;fr&quot;&gt;tous ce qui est disponible&lt;/a&gt; et bientôt concurrencer Google &lt;img src=&quot;/blog/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.grafactory.net/blog/post/2007/09/07/Recherche-Fulltext-et-InnoDB-avec-Mysql#comment-form</comments>
      <wfw:comment>http://www.grafactory.net/blog/post/2007/09/07/Recherche-Fulltext-et-InnoDB-avec-Mysql#comment-form</wfw:comment>
      <wfw:commentRss>http://www.grafactory.net/blog/feed/rss2/comments/150</wfw:commentRss>
      </item>
    
</channel>
</rss>