Intégrez Elasticsearch dans votre application Rails

Qu'est-ce qu'Elasticsearch?

Elasticsearch est un moteur de recherche en texte intégral OSS développé par Elastic. Vous pouvez extraire rapidement un document contenant le mot souhaité à partir d'un grand nombre de documents.

L'idée de travailler avec la recherche élastique dans les applications Rails

  1. Le moteur de recherche en texte intégral contient les données à rechercher.
  2. Lors de la recherche côté application, une requête est envoyée au moteur de recherche et le résultat est renvoyé.
  3. Lorsque les données à rechercher sont mises à jour côté application, les données du moteur de recherche sont également mises à jour en coopération.

Utilisation de la recherche élastique dans l'application Rails

Créer un index

Elasticsearch crée un index comme emplacement de stockage de vos données. C'est comme une table dans une base de données relationnelle.

Tout d'abord, installez une gemme dédiée pour gérer les modèles Rails dans Elasticsearch. Écrivez ce qui suit dans le Gemfile et l'installation du bundle.

gem 'elasticsearch-model', github: 'elastic/elasticsearch-rails'
gem 'elasticsearch-rails', github: 'elastic/elasticsearch-rails'

Une fois l'installation du bundle terminée, indexez-le dans Elasticsearch. Incluez Elasticsearch :: Model dans le modèle que vous souhaitez rechercher.

class Article < ActiveRecord::Base
  include Elasticsearch::Model
end

Votre modèle est maintenant prêt à fonctionner avec Elasticsearch. Vous pouvez créer un index avec un code comme celui-ci:

Article.__elasticsearch__.create_index! force:true

Mettre le document dans l'index

Dans Elasticsearch, les données de l'index sont appelées un document. Saisissez les données que vous souhaitez rechercher dans l'index.

Importez le document dans Elasticsearch avec le code suivant.


Article.import

Le document est désormais enregistré dans l'index Elasticsearch.

Rechercher des documents

Pour rechercher le document, soumettez une requête à Elasticsearch. Vous pouvez interroger Elasticsearch à partir de Rails en écrivant:

response = Article.search 'hoge'

Vous pouvez rechercher des documents en spécifiant une chaîne de recherche comme argument.

Si vous recevez les paramètres de la réception et effectuez une recherche, vous pouvez écrire comme suit.

def index
  @articles = Article.search(params)
end

Lorsque l'enregistrement à rechercher est mis à jour côté Rails, le document Elasticsearch est mis à jour en conséquence.

Lorsqu'il s'agit d'exploiter réellement le service, il est nécessaire de mettre à jour le document Elasticsearch lorsque l'enregistrement est mis à jour côté Rails.

Pour simplement mettre à jour la documentation Elasticsearch, implémentez:

Article.first.__elasticsearch__.update_document

Il existe une autre méthode appelée delete_document, que vous pouvez utiliser pour supprimer un document.

Vous pouvez également mettre à jour le document automatiquement lorsque vous mettez à jour l'enregistrement, sans avoir à l'écrire explicitement comme ci-dessus. Dans elasticsearch-model, qui est une gemme, si vous incluez Elasticsearch :: Model :: Callbacks dans Model, il enverra une requête pour mettre à jour le document Elasticsearch lorsque l'enregistrement est mis à jour.

class Article
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
end

Intégrez Elasticsearch dans votre application Rails

Créez en fait le traitement autour de la recherche du modèle d'article.

article-m/app/models/concerns/article/searchable.rb


require 'active_support/concern'
module Article::Searchable
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model
    
    index_name "article"

    settings index: {
      number_of_shards: 1,
      number_of_replicas: 0
    } do
      mapping _source: { enabled: true } do
        indexes :id, type: 'integer', index: 'not_analyzed'
        indexes :title, type: 'string'
        indexes :content, type: 'text'
      end
    end
  end

  module ClassMethods
    def create_index!(options={})
      client = __elasticsearch__.client
      client.indices.delete index: "article" rescue nil if options[:force]
      client.indices.create index: "article",
      body: {
        settings: settings.to_hash,
        mappings: mappings.to_hash
      }
    end
  end
end

Dans le module, incluez Elasticsearch :: Model pour utiliser des méthodes utiles.

Écrivez le nom de l'index dans nom_index et les paramètres d'index dans les paramètres. number_of_shards et number_of_replicas sont des paramètres de partition et de réplique liés à la tolérance aux pannes et aux performances.

le mappage détermine la manière dont l'index est défini. C'est comme un schéma de table dans RDB.

create_index! est un assistant qui crée en fait un index. Puisque __elasticsearch __. Client peut prendre l'objet du client Elasticsearch, Vous pouvez effectuer diverses opérations via ce client.

Incluez le module créé dans le modèle.

article-m/app/models/article.rb


class Article < ActiveRecord::Base
  include Article::Searchable
  def self.search_message(keyword)
    if keyword.present?
      query = {
        "query": {
          "match": {
            "message": keyword
          }
        }
      }
      Article.__elasticsearch__.search(query)
    else
      Article.none
    end
  end
end

Créez une requête de recherche à partir des mots-clés que vous recevez et transmettez-la à Article.elasticsearch.search. En appelant elasticsearch.search sur le modèle Article, elasticsearch-rails et elasticsearch-model émettront une requête.

Le contrôleur ressemble à ceci:

article-m/app/controllers/articles_controller.rb


class ArticlesController < ApplicationController
  def search
    @keyword = params[:keyword]
    @articles = Article.search_message(@keyword).paginate(page: params[:page])
  end

Ce qui précède est un exemple d'incorporation d'Elasticsearch dans une application Rails.

référence

Exécutez Elasticsearch on Rails en utilisant elastisearch-rails [pour les débutants] [Résumé de ce que j'ai fait pour intégrer Elasticsearch dans le processus de recherche des applications Rails](https://qiita.com/minamijoyo/items/31118d4aa3d06513ad4d#elasticsearch%E3%82%92rails%E3%82%A2%E3%83% 97% E3% 83% AA% E3% 81% AB% E7% B5% 84% E3% 81% BF% E8% BE% BC% E3% 82% 80)

Recommended Posts

Intégrez Elasticsearch dans votre application Rails
Incorporer circleCI dans l'application CircleCI Rails
Intégrez Docker à votre portefeuille Ruby on Rails!
Incorporez du code C / C ++ existant dans votre application Android
Rails + Mémo d'enquête ElasticSearch
[Core ML] Incorporez un modèle ML généré automatiquement dans l'application
Comment déployer jQuery dans les applications Rails à l'aide de Webpacker
Créez votre propre plugin Elasticsearch