Integrieren Sie Elasticsearch in Ihre Rails-App

Was ist Elasticsearch?

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.

Die Idee, mit der elastischen Suche in Rails-Apps zu arbeiten

  1. Die Volltextsuchmaschine enthält die zu durchsuchenden Daten.
  2. Bei der Suche auf der Anwendungsseite wird eine Abfrage an die Suchmaschine gesendet und das Ergebnis zurückgegeben.
  3. Wenn die zu durchsuchenden Daten auf der Anwendungsseite aktualisiert werden, werden auch die Daten der Suchmaschine in Zusammenarbeit aktualisiert.

Arbeiten mit der elastischen Suche in der Rails-App

Erstellen Sie einen Index

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

Legen Sie das Dokument in den Index

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.

Dokumente durchsuchen

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 der zu durchsuchende Datensatz auf der Rails-Seite aktualisiert wird, wird das Elasticsearch-Dokument entsprechend aktualisiert.

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

Integrieren Sie Elasticsearch in Ihre Rails-App

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.

Referenz

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

Integrieren Sie Elasticsearch in Ihre Rails-App
Integrieren Sie circleCI in die CircleCI Rails-App
Integrieren Sie Docker in Ihr Ruby on Rails-Portfolio!
Integrieren Sie vorhandenen C / C ++ - Code in Ihre Android-Anwendung
Rails + ElasticSearch Survey Memo
[Core ML] Integrieren Sie ein automatisch generiertes ML-Modell in die App
So stellen Sie jQuery in Rails-Apps mit Webpacker bereit
Erstellen Sie Ihr eigenes Elasticsearch-Plugin