{"id":171,"date":"2011-11-16T14:30:52","date_gmt":"2011-11-16T12:30:52","guid":{"rendered":"https:\/\/www.ideematic.com\/actualites\/?p=171"},"modified":"2011-11-16T14:30:52","modified_gmt":"2011-11-16T12:30:52","slug":"indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3","status":"publish","type":"post","link":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/","title":{"rendered":"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3"},"content":{"rendered":"

[vc_row][vc_column][vc_column_text]Sphinx<\/a> est un serveur de recherche full text permettant d’indexer et de rechercher dans des donn\u00e9es stock\u00e9es soit dans des bases de donn\u00e9es SQL, no SQL ou alors dans un syst\u00e8me de fichiers.<\/p>\n

Il peut facilement s’int\u00e9grer \u00e0 une application Ruby On Rails via la gem Thinking Sphinx.<\/a> On d\u00e9finit alors dans les mod\u00e8les tous les attributs qui doivent \u00eatre index\u00e9s. Cela fonctionne parfaitement lorsque notre application utilise une seule et unique locale.<\/p>\n

Prenons l’exemple d’une application dans laquelle nous avons d\u00e9fini un mod\u00e8le Actuality :<\/p>\n

\nclass Actuality < ActiveRecord::Base\n\n  validates :title, :presence => true\n  validates :body, :presence => true\n\n  define_index do\n    indexes :title\n    indexes :summary\n    indexes :body\n\n    set_property :delta => true\n  end\nend\n<\/pre>\n

Que se passe-t’il donc lorsque l’application d\u00e9velopp\u00e9e est internationalis\u00e9e et que les traductions des contenus stock\u00e9s en base doivent \u00eatre index\u00e9s par locale ?<\/p>\n

Avant d’arriver au r\u00e9sultat final, jetons un coup d’oeil rapide sur la gestion de la traduction des contenus.<\/p>\n

Nous utilisons pour cela la gem Globalize3<\/a> qui permet de stocker les traductions de certains attributs d’un mod\u00e8le dans une table \u00e0 part.<\/p>\n

\ngem 'globalize3' # \u00e0 placer dans le Gemfile\n<\/pre>\n

Ensuite, il faut indiquer au mod\u00e8le Actuality \u00e0 qui nous allons traduire un certain nombre de ces attributs<\/p>\n

\nclass Actuality < ActiveRecord::Base\n\n  translates :title, :body\n\n  validates :title, :presence => true\n  validates :body, :presence => true\n\n  define_index do\n    indexes :title\n    indexes :body\n\n    set_property :delta => true\n  end\nend\n<\/pre>\n

Pour finir, il faut modifier la structure de la base de donn\u00e9es pour ajouter la table contenant les attributs traduits<\/p>\n

\nclass AddTranlationsToActualities < ActiveRecord::Migration\n  def self.up\n    Actuality.create_translation_table! :title => :string, :body => :text\n  end\n\n  def self.down\n    Actuality.drop_translation_table!\n  end\nend\n<\/pre>\n

Maintenant que les attributs title et body d’Actuality sont traduits via Globalize3, nous pouvons d\u00e9finir les index associ\u00e9s \u00e0 chaque locale en pr\u00e9cisant que les attributs qui doivent \u00eatre index\u00e9s sont ceux de la table translations associ\u00e9e \u00e0 notre mod\u00e8le et que nous utilisons un filtre de s\u00e9lection diff\u00e9rent pour chaque locale :<\/p>\n

\nclass Actuality < ActiveRecord::Base\n\n  translates :title, :body\n\n  validates :title, :presence => true\n  validates :body, :presence => true\n\n  define_index('actuality_fr') do\n    indexes translations.title, :as => :title\n    indexes translations.body, :as => :body\n\n    where "actuality_translations.locale='fr'"\n\n    set_property :delta => true\n  end\n\n  define_index('actuality_de') do\n    indexes translations.title, :as => :title\n    indexes translations.body, :as => :body\n\n    where "actuality_translations.locale='de'"\n\n    set_property :delta => true\n  end\nend\n<\/pre>\n

D\u00e9sormais comment utiliser les nouveaux index d\u00e9finis ? Nous pouvons tout simplement indiquer \u00e0 la m\u00e9thode search sur quel index rechercher.<\/p>\n

\nActuality.search "*#{q}*" , :index => "actuality_fr"\nActuality.search "*#{q}*" , :index => "actuality_de"\n<\/pre>\n

En conclusion, il est possible tr\u00e8s simplement dans Rails3<\/a> de cr\u00e9er un moteur de recherche bas\u00e9 sur Sphinx et recherchant des contenus en fonction de la locale de l’utilisateur.<\/p>\n

Auteur : Micha\u00ebl Mithouard<\/strong><\/p>\n

[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"

[vc_row][vc_column][vc_column_text]Sphinx est un serveur de recherche full text permettant d’indexer et de rechercher dans des donn\u00e9es stock\u00e9es soit dans des bases de donn\u00e9es SQL, no SQL ou alors dans un syst\u00e8me de fichiers. Il peut facilement s’int\u00e9grer \u00e0 une application Ruby On Rails via la gem Thinking Sphinx. On d\u00e9finit alors dans les mod\u00e8les tous […]<\/p>\n","protected":false},"author":11,"featured_media":1644,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[27],"tags":[50,51,52,53],"acf":[],"yoast_head":"\nIndexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3 - Id\u00e9ematic<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3 - Id\u00e9ematic\" \/>\n<meta property=\"og:description\" content=\"[vc_row][vc_column][vc_column_text]Sphinx est un serveur de recherche full text permettant d’indexer et de rechercher dans des donn\u00e9es stock\u00e9es soit dans des bases de donn\u00e9es SQL, no SQL ou alors dans un syst\u00e8me de fichiers. Il peut facilement s’int\u00e9grer \u00e0 une application Ruby On Rails via la gem Thinking Sphinx. On d\u00e9finit alors dans les mod\u00e8les tous […]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\" \/>\n<meta property=\"og:site_name\" content=\"Id\u00e9ematic\" \/>\n<meta property=\"article:published_time\" content=\"2011-11-16T12:30:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ideematic.com\/wp-content\/uploads\/2011\/11\/sphinx.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1314\" \/>\n\t<meta property=\"og:image:height\" content=\"418\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"mick\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"mick\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\"},\"author\":{\"name\":\"mick\",\"@id\":\"https:\/\/www.ideematic.com\/#\/schema\/person\/6dd73b12c35e71d0edc290b3841dfcac\"},\"headline\":\"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3\",\"datePublished\":\"2011-11-16T12:30:52+00:00\",\"dateModified\":\"2011-11-16T12:30:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\"},\"wordCount\":553,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.ideematic.com\/#organization\"},\"keywords\":[\"globalize\",\"ruby\",\"ruby on rails\",\"sphinx\"],\"articleSection\":[\"Ruby On Rails\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\",\"url\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\",\"name\":\"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3 - Id\u00e9ematic\",\"isPartOf\":{\"@id\":\"https:\/\/www.ideematic.com\/#website\"},\"datePublished\":\"2011-11-16T12:30:52+00:00\",\"dateModified\":\"2011-11-16T12:30:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.ideematic.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby On Rails\",\"item\":\"https:\/\/www.ideematic.com\/actualites\/category\/ruby-on-rails\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ideematic.com\/#website\",\"url\":\"https:\/\/www.ideematic.com\/\",\"name\":\"Id\u00e9ematic\",\"description\":\"Id\u00e9ematic est une agence digitale \u00e0 Strasbourg et Paris\",\"publisher\":{\"@id\":\"https:\/\/www.ideematic.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ideematic.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.ideematic.com\/#organization\",\"name\":\"Id\u00e9ematic\",\"url\":\"https:\/\/www.ideematic.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.ideematic.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.ideematic.com\/wp-content\/uploads\/2017\/12\/agence-react-native-ruby-on-rails.png\",\"contentUrl\":\"https:\/\/www.ideematic.com\/wp-content\/uploads\/2017\/12\/agence-react-native-ruby-on-rails.png\",\"width\":1200,\"height\":500,\"caption\":\"Id\u00e9ematic\"},\"image\":{\"@id\":\"https:\/\/www.ideematic.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.ideematic.com\/#\/schema\/person\/6dd73b12c35e71d0edc290b3841dfcac\",\"name\":\"mick\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.ideematic.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&r=g\",\"caption\":\"mick\"},\"url\":\"https:\/\/www.ideematic.com\/actualites\/author\/mick\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3 - Id\u00e9ematic","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/","og_locale":"fr_FR","og_type":"article","og_title":"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3 - Id\u00e9ematic","og_description":"[vc_row][vc_column][vc_column_text]Sphinx est un serveur de recherche full text permettant d’indexer et de rechercher dans des donn\u00e9es stock\u00e9es soit dans des bases de donn\u00e9es SQL, no SQL ou alors dans un syst\u00e8me de fichiers. Il peut facilement s’int\u00e9grer \u00e0 une application Ruby On Rails via la gem Thinking Sphinx. On d\u00e9finit alors dans les mod\u00e8les tous […]","og_url":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/","og_site_name":"Id\u00e9ematic","article_published_time":"2011-11-16T12:30:52+00:00","og_image":[{"width":1314,"height":418,"url":"https:\/\/www.ideematic.com\/wp-content\/uploads\/2011\/11\/sphinx.jpg","type":"image\/jpeg"}],"author":"mick","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"mick","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#article","isPartOf":{"@id":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/"},"author":{"name":"mick","@id":"https:\/\/www.ideematic.com\/#\/schema\/person\/6dd73b12c35e71d0edc290b3841dfcac"},"headline":"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3","datePublished":"2011-11-16T12:30:52+00:00","dateModified":"2011-11-16T12:30:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/"},"wordCount":553,"commentCount":0,"publisher":{"@id":"https:\/\/www.ideematic.com\/#organization"},"keywords":["globalize","ruby","ruby on rails","sphinx"],"articleSection":["Ruby On Rails"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/","url":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/","name":"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3 - Id\u00e9ematic","isPartOf":{"@id":"https:\/\/www.ideematic.com\/#website"},"datePublished":"2011-11-16T12:30:52+00:00","dateModified":"2011-11-16T12:30:52+00:00","breadcrumb":{"@id":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.ideematic.com\/actualites\/2011\/11\/indexation-de-contenus-multi-langue-sur-rails3-avec-sphinx-et-globalize3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.ideematic.com\/"},{"@type":"ListItem","position":2,"name":"Ruby On Rails","item":"https:\/\/www.ideematic.com\/actualites\/category\/ruby-on-rails\/"},{"@type":"ListItem","position":3,"name":"Indexation de contenus multi-langue sur Rails3 avec Sphinx et Globalize3"}]},{"@type":"WebSite","@id":"https:\/\/www.ideematic.com\/#website","url":"https:\/\/www.ideematic.com\/","name":"Id\u00e9ematic","description":"Id\u00e9ematic est une agence digitale \u00e0 Strasbourg et Paris","publisher":{"@id":"https:\/\/www.ideematic.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ideematic.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.ideematic.com\/#organization","name":"Id\u00e9ematic","url":"https:\/\/www.ideematic.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.ideematic.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.ideematic.com\/wp-content\/uploads\/2017\/12\/agence-react-native-ruby-on-rails.png","contentUrl":"https:\/\/www.ideematic.com\/wp-content\/uploads\/2017\/12\/agence-react-native-ruby-on-rails.png","width":1200,"height":500,"caption":"Id\u00e9ematic"},"image":{"@id":"https:\/\/www.ideematic.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.ideematic.com\/#\/schema\/person\/6dd73b12c35e71d0edc290b3841dfcac","name":"mick","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.ideematic.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/?s=96&r=g","caption":"mick"},"url":"https:\/\/www.ideematic.com\/actualites\/author\/mick\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/posts\/171"}],"collection":[{"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":0,"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/media\/1644"}],"wp:attachment":[{"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ideematic.com\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}