Skip to content

krayinc/opensearch-compatibility-testing

Repository files navigation

Elasticsearch gems を使って OpenSearch/Elasticsearch サーバー互換を検証するミニ Rails アプリ

OpenSearch Service への移行にあたり、同一コードで OpenSearch と(現行の)Elasticsearch 7 系の基本操作が通るかを検証する最小構成です。

    • 使用クライアント Gem: elasticsearch 7.13.3, elasticsearch-model 7.2.0, elasticsearch-rails 7.2.0, elasticsearch-dsl

使い方(ローカル)

  1. 依存のインストール
bundle install
bundle exec rails db:prepare # SQLite の DB を用意(Article モデルで使用)
  1. バックエンド起動(両方)

spec では Elasticsearch / OpenSearch の両方に接続して同一結果になることまで検証します。ローカルでは以下のいずれかで 19200/29200 ポートに起動してください。

  • 簡易手順: ./bin/test_backends(起動→プラグイン導入→テスト実行まで自動)

  • 手動起動例:

    docker run -d --name es7 -p 19200:9200 \
      -e discovery.type=single-node \
      -e xpack.security.enabled=false \
      -e ES_JAVA_OPTS='-Xms512m -Xmx512m' \
      docker.elastic.co/elasticsearch/elasticsearch:7.1.1
    docker exec es7 /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch analysis-kuromoji
    docker restart es7
    
    docker run -d --name os3 -p 29200:9200 \
      -e discovery.type=single-node \
      -e plugins.security.disabled=true \
      -e DISABLE_INSTALL_DEMO_CONFIG=true \
      -e OPENSEARCH_JAVA_OPTS='-Xms512m -Xmx512m' \
      opensearchproject/opensearch:3.1.0
    docker exec os3 /usr/share/opensearch/bin/opensearch-plugin install --batch analysis-kuromoji
    docker restart os3
  1. テスト実行
# ES_URL / OS_URL を指定して 1 回の RSpec 実行で全テストを網羅
ES_URL=http://127.0.0.1:19200 OS_URL=http://127.0.0.1:29200 \
ELASTICSEARCH_URL=http://127.0.0.1:19200 bundle exec rspec --format documentation

CI(GitHub Actions)

.github/workflows/ci.yml で Elasticsearch / OpenSearch を起動し、bundle exec rspec を 1 度だけ実行して全テスト(バックエンド比較含む)をカバーします。

実装の要点

  • クライアント初期化は config/initializers/elasticsearch.rbELASTICSEARCH_URL(デフォルト http://127.0.0.1:9200)で接続先を切替。
  • モデルは app/models/article.rb を使用(elasticsearch-model 連携、index_name/settings/mappings を定義)。
  • テスト(spec/elasticsearch_compat_spec.rb)は次を確認します:
    • 既存インデックス削除 → 設定/マッピング付きで再作成 → refresh
    • ActiveRecord で Article を作成 → import で取り込み → refresh
    • elasticsearch-dslmatch クエリを構築し、Article.search(モデル経由)と client.search(低レベル)でヒット数 ≥ 1 を確認

必要に応じて、インデックス設定/マッピングなどの追加ケースを増やせます(最小構成のままにしています)。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages