Elasticsearch ist eine von Elastic entwickelte OSS-Volltextsuchmaschine. Sie können schnell ein Dokument mit dem gewünschten Wort aus einer großen Anzahl von Dokumenten extrahieren.
Elasticsearch erstellt einen Index als Speicherort für Ihre Daten. Es ist wie eine Tabelle in einer relationalen Datenbank.
Installieren Sie zunächst ein spezielles Juwel für Rails-Modelle in Elasticsearch. Schreiben Sie Folgendes in die Gemfile- und Bundle-Installation.
gem 'elasticsearch-model', github: 'elastic/elasticsearch-rails'
gem 'elasticsearch-rails', github: 'elastic/elasticsearch-rails'
Nachdem die Bundle-Installation abgeschlossen ist, indizieren Sie sie in Elasticsearch. Fügen Sie Elasticsearch :: Model in das Modell ein, das Sie suchen möchten.
class Article < ActiveRecord::Base
include Elasticsearch::Model
end
Ihr Modell kann jetzt mit Elasticsearch arbeiten. Sie können einen Index mit folgendem Code erstellen:
Article.__elasticsearch__.create_index! force:true
In Elasticsearch werden die Daten im Index als Dokument bezeichnet. Geben Sie die zu suchenden Daten in den Index ein.
Importieren Sie das Dokument mit dem folgenden Code in Elasticsearch.
Article.import
Das Dokument ist jetzt im Elasticsearch-Index registriert.
Senden Sie zum Durchsuchen des Dokuments eine Abfrage an Elasticsearch. Sie können Elasticsearch von Rails abfragen, indem Sie Folgendes schreiben:
response = Article.search 'hoge'
Sie können nach Dokumenten suchen, indem Sie eine Suchzeichenfolge als Argument angeben.
Wenn Sie die Parameter von der Rezeption erhalten und suchen, können Sie wie folgt schreiben.
def index
@articles = Article.search(params)
end
Wenn Sie den Dienst tatsächlich betreiben möchten, müssen Sie das Elasticsearch-Dokument aktualisieren, wenn der Datensatz auf der Rails-Seite aktualisiert wird.
Implementieren Sie Folgendes, um die Elasticsearch-Dokumentation einfach zu aktualisieren:
Article.first.__elasticsearch__.update_document
Es gibt eine andere Methode namens delete_document, mit der Sie ein Dokument löschen können.
Sie können das Dokument auch automatisch aktualisieren, wenn Sie den Datensatz aktualisieren, ohne es explizit wie oben schreiben zu müssen. Wenn Sie im Elasticsearch-Modell, das ein Juwel ist, Elasticsearch :: Model :: Callbacks in Model aufnehmen, wird eine Abfrage gesendet, um das Elasticsearch-Dokument zu aktualisieren, wenn der Datensatz aktualisiert wird.
class Article
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
end
Erstellen Sie tatsächlich die Verarbeitung rund um die Suche nach dem Artikelmodell.
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
Fügen Sie in das Modul Elasticsearch :: Model ein, um nützliche Methoden zu verwenden.
Schreiben Sie den Indexnamen in index_name und die Indexeinstellungen in settings. number_of_shards und number_of_replicas sind Shard- und Replikateinstellungen, die sich auf Fehlertoleranz und Leistung beziehen.
Die Zuordnung bestimmt, wie der Index definiert wird. Es ist wie ein Tabellenschema in RDB.
create_index! ist ein Helfer, der tatsächlich einen Index erstellt. Da __elasticsearch __. Client das Objekt des Elasticsearch-Clients übernehmen kann, Über diesen Client können Sie verschiedene Vorgänge ausführen.
Fügen Sie das erstellte Modul in das Modell ein.
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
Erstellen Sie eine Suchabfrage aus den Schlüsselwörtern, die Sie erhalten, und übergeben Sie sie an Article.elasticsearch.search. Durch Aufrufen von elasticsearch.search im Artikelmodell lösen elasticsearch-Rails und elasticsearch-model eine Abfrage aus.
Der Controller sieht folgendermaßen aus:
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
Das Obige ist ein Beispiel für die Integration von Elasticsearch in eine Rails-App.
Führen Sie Elasticsearch on Rails mit elastisearch-Rails aus [für Anfänger] [Zusammenfassung dessen, was ich getan habe, um Elasticsearch in den Suchprozess von Rails-Apps einzubeziehen](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