使用Docker在Rails和OpenSearch之间进行整合【环境设置】
首先
使用Docker Compose搭建Rails应用程序以使用OpenSearch的开发环境的构建步骤如下。
方針可以翻譯為 “policy” 或 “strategy”,取決於上下文。
基于以下两个理由,我们使用 gem elasticsearch-rails 来实现Rails和OpenSearch的联动。
-
- rubyとopensearchを使ったクライアントは2022/12/11時点では公式に存在しない
- OpenSearch1系はElasticSearchの7.10をサポートしている
执行环境
Docker: 20.10.14
docker-compose: 1.29.2
ruby: 2.7.6
rails: 6.0.5
OpenSearch: 1.3.6
前提 (Qian2 ti2)
-
- docker-composeでrailsが構築できていること
-
- 検索として扱うModelが存在し、レコードを持っていること
今回は例としてBookModelを使用
構建開發環境
使用docker-compose来运行OpenSearch
在开发环境中,我们将以下内容添加到用于使用的docker-compose.yml文件中的services部分。
开放搜索
我们基于《为什么使用Docker的OpenSearch》的公式文档,但这次我们将在本地环境中进行操作,将discovery.type设置为single-node,并将DISABLE_INSTALL_DEMO_CONFIG和DISABLE_SECURITY_PLUGIN选项更改为true。
opensearch:
image: opensearchproject/opensearch:1.3.6
container_name: opensearch
environment:
- cluster.name=opensearch-cluster
- node.name=opensearch-node1
- discovery.type=single-node
- bootstrap.memory_lock=true
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
- "DISABLE_INSTALL_DEMO_CONFIG=true"
- "DISABLE_SECURITY_PLUGIN=true"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./tmp/opensearch_data:/usr/share/opensearch/data
ports:
- 9200:9200
- 9600:9600
networks:
- dev
开放搜索仪表板
在本文中,我们不使用仪表板,但是如果启用它,您可以通过浏览器进行索引创建、确认和文档搜索。
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:1.3.6
container_name: opensearch-dashboards
environment:
- 'OPENSEARCH_HOSTS=["http://opensearch:9200"]'
- "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true"
ports:
- 5601:5601
links:
- opensearch
networks:
- dev
Ruby on Rails的配置
我們將在現有的Rails設定中添加以下內容。
rails_app:
links:
- opensearch
networks:
- dev
其他设置
定义网络,使容器之间能够通信。
networks:
dev:
确认行动
在使用docker-compose up之后,从控制台中使用curl命令来确认响应。
curl http://localhost:9200 -ku 'admin:admin'
{
"name" : "opensearch-node1",
"cluster_name" : "opensearch-cluster",
"cluster_uuid" : "xxxxxxxxxxxxxxxxx",
... <省略>
"tagline" : "The OpenSearch Project: https://opensearch.org/"
}
使用elasticsearch-rails gem来使用OpenSearch。
安装Gem
为了保持与OpenSearch的兼容性,我们将安装Elastisearch相关的gem。而elasticsearch将被锁定在7.10版本。
gem 'elasticsearch-model', '7.1.1'
gem 'elasticsearch-rails', '7.1.1'
gem 'elasticsearch', '7.10.1'
进行config的设置
为了简洁表达,将值直接设置为host,user,password,但本来应该使用适当的方法如ENV进行设置。
Elasticsearch::Model.client = Elasticsearch::Client.new(
host: 'http://opensearch:9200',
user: 'admin',
password: 'admin'
)
将elasticsearch-rails应用于Model
require 'elasticsearch/model'
class Book < ActiveRecord::Base
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
end
创建一条用于(随意)确认的记录
Book.create title: 'コンサル一年目が学ぶこと'
Book.create title: '採用基準'
Book.create title: 'メタプログラミングRuby'
创建索引
Book.__elasticsearch__.create_index!
输入数据
Book.__elasticsearch__.import
请参考elasticsearch-model的README了解详细使用方法。
确认行动
请执行search方法,以任意文本作为参数,并确保返回了期望的记录。
Book.__elasticsearch__.search('メタ').records.first
=> #<Book:0x000055a737aa7218
id: 3,
title: 'メタプログラミングRuby',
... 省略
最后
在开发环境中,
我们能够在docker-compose上使Rails和OpenSearch配合使用。
在AWS环境中,根据配置的不同,只需切换config/initializers/elasticsearch.rb文件中的host,即可将其切换到”AWS OpenSearch”。
以下是一个中国人的本土化表达方式:
相关链接 or 参考链接
-
- opensearch docs 1.3
- elasticsearch-rails