0

タイヤを介してelasticsearchからのデータを示すテーブルがあります。テーブルは、json 形式でデータを非同期に取得します。そのため、エントリを変更しようとすると、テーブルにはまだエントリの「古い」状態が表示されます (アクションは、インデックス/テーブルに保存した直後にリダイレクトされます)。エントリを削除または追加する場合も同じです。

しかし、これは時々起こります。データが取得される前に「スリープ(0.3)」をインデックスアクションに追加すると、機能することがわかりました。

私のモデル:

# encoding: utf-8
class Group
  include Mongoid::Document
  include Mongoid::Timestamps
  include Tire::Model::Search
  include Tire::Model::Callbacks

  # Relations
  has_and_belongs_to_many :users, index: true
  has_many :group_rights, dependent: :destroy

  accepts_nested_attributes_for :group_rights, allow_destroy: true, autosave: true
  ###

  # Validates
  validates :name, presence: true
  validates :description, presence: true
  ###

  # Mongoid Fields
  field :name, type: String
  field :description, type: String
  ###

  # Elasticsearch
  index_name "#{Tire::Model::Search.index_prefix}groups" # Indexname /initializers/tire.rb
  mapping do
    indexes :_id, :index => :not_analyzed
    indexes :name
    indexes :description
  end

  def to_indexed_json
    to_json
  end 
  ###

  # Methods

  ###

end

これはタイヤのコールバックと関係があると思います。しかし、なぜこれが遅いのでしょうか?それに応じてインデックスを更新するより良い方法はありますか?

私は、debian スクイーズで openjdk-6 で Elasticsearch 0.90 を使用しています。

ありがとう、パトリック

4

1 に答える 1

0

Elasticsearch は更新をすぐにインデックスに書き込みません。デフォルトで 1 秒の更新間隔があるため、書き込みと読み取りが 1 秒未満で行われる場合、それが問題の原因である可能性があります。refresh-interval を下げるか (これはお勧めしません)、コントローラで Elasticsearch に書き込んだ後に refresh を呼び出すことができます。

Tire.index("whatever").refresh 
于 2013-05-20T20:50:30.830 に答える