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.
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
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.
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
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
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.
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