5

Rails アプリの一部である MongoMapper モデルで検索機能を提供するために、Tire と elasticsearch を使用しています。次の構成 (config/environments/env_name.rb 内) を使用する環境に再デプロイしたときに、このモデルのマッピングが更新されないという問題に遭遇しました。

config.cache_classes = true

クラスだけをリロードしても問題は解決しないようです (おそらく、新しいマッピングは既存のデータと互換性がないのではないでしょうか?)。代わりに、次のことを行う必要がありました。

MyModel.index.delete
<restart the app or reload the class>
MyModel.index.import MyModel.all

a)のより良い方法があるかどうか疑問に思いました。私のモデルコードで定義された最新のマッピングが、各展開後にelasticsearchによって使用されていることを確認しますが、b)。完全なデータセットでインデックスを不必要に再作成するのを避けますか?

通常は Chef を使用してデプロイするので、私が成功裏に使用した 3 つのステップをそれほど問題なく自動化できました。しかし、私はelasticsearchとtireに慣れていないので、両方を誤用しているか、不必要に難しくしている可能性が高いと思いました.

4

1 に答える 1

5

ここにいくつかのポイントがあります:

  • クラスが読み込まれると、タイヤは正しいマッピングでインデックスを作成しようとします
  • ただし、モデルが既に存在する場合、 Tire はモデルのインデックスを作成しようとはしません。

では、あなたの質問は実際には適切なワークフローに関するものですか? アプリケーションの新しいバージョンをデプロイするときは、ある種のバックアップからデータベースを再作成しないのと同じように、インデックスを再作成しないでください。

モデルの現在の定義に準拠するインデックス マッピングを自動的にチェックすることは確かに可能です ( と比較しMyModel.tire.index.mappingMyModel.tire.mapping異なる場合は再入力するなど)、これは慎重に行う必要があります。

開発者は通常、いつマッピングを変更したかを知っており、データのインデックスを再作成する必要があります。インデックスを削除して再作成することは、検索のダウンタイムを意味し、大規模なアプリケーションでは実現できません。

my-index-2012-12より適切な解決策は、データをインポートするときなどに特定のインデックス名を使用し、my-indexエイリアスをこのインデックスにポイントすることです。次に、ダウンタイムなしで、インデックスを自由に再設定し、完了したらエイリアスを反転できます。Tire は、この種のワークフロー (Rake インポート タスクなど) であなたをサポートしようと懸命に努力しています。

于 2012-12-12T20:44:10.073 に答える