Переиндексирование Elasticsearch: как направлять обновления нового индекса во время его создания?

Я понимаю переиндексацию с использованием псевдонима, чтобы избежать простоев, как описано здесь: Есть ли более разумный способ переиндексировать elasticsearch?

Но остается одна проблема: скажем, переиндексация занимает час, а исходная БД продолжает меняться. Мне потребуются какие-либо обновления, чтобы перейти к обоим индексам.

Есть ли способ сделать это?

В противном случае я бы предпочел, чтобы обновления шли в новый индекс, а запросы по-прежнему обслуживались из старого индекса. Но, по крайней мере, в Тире я не видел способа использовать разные индексы для чтения и записи. Это можно сделать?


person Lars P    schedule 09.04.2013    source источник


Ответы (2)


Вы не можете обновить два индекса одновременно из Elasticsearch. Вы можете обработать это на своей стороне и 2 запроса индекса в Elasticsearch.

Тем не менее, вы, вероятно, можете использовать здесь псевдоним, хотя я Я почти уверен, что вы можете искать более чем по одному индексу с помощью Tire (но я не знаю Tire)

У вас старый index1

Переместите весь свой контент в index2 Добавьте псевдоним index поверх index1, index2

Когда индексирование завершено, удалите index1

person dadoonet    schedule 10.04.2013

Чтобы разрешить изменение индекса с нулевым временем простоя, даже когда поисковая система обновляется новым пользовательским контентом, вы можете использовать следующую стратегию:

Определите псевдонимы для действий чтения и записи, которые будут указывать на индекс ES. Когда модель обновляется, найдите псевдоним model_write и используйте его для записи во все отслеживаемые индексы, которые будут включать как текущие активные, так и любые, которые создаются в фоновом режиме.

class User < ActiveRecord::Base
  def self.index_for_search(user_id)
    Timeout::timeout(5) do
      user = User.find_by_id(user_id)
      write_alias = Tire::Alias.find("users_write")
      if write_alias
        write_alias.indices.each do |index_name|
          index = Tire::Index.new(index_name)
          if user
            index.store user
          else
            index.remove 'user', user_id
          end
        end
      else
        raise "Cannot index without existence of 'users_write' alias."
      end
    end
  end
end

Теперь, когда вы хотите выполнить полное перестроение индекса (или начальное создание индекса), добавьте новый индекс, добавьте его к псевдониму и начните его создание, зная, что любые активные пользователи будут добавлять свои данные в оба индекса одновременно. Продолжайте читать из старого индекса, пока не будет построен новый, затем переключите псевдоним чтения.

class SearchHelper
  def self.set_alias_to_index(alias_name, index_name, clear_aliases = true)
    tire_alias = Tire::Alias.find(alias_name)
    if tire_alias
      tire_alias.indices.clear if clear_aliases
      tire_alias.indices.add index_name
    else
      tire_alias = Tire::Alias.new(:name => alias_name)
      tire_alias.index index_name
    end

    tire_alias.save
  end
end

def self.reindex_users_index(options = {})
  finished = false
  read_alias_name = "users"
  write_alias_name = "users_write"
  new_index_name = "#{read_alias_name}_#{Time.now.to_i}"

  # Make new index for re-indexing.
  index = Tire::Index.new(new_index_name)
  index.create :settings => analyzer_configuration,
               :mappings => { :user => user_mapping }
  index.refresh

  # Add the new index to the write alias so that any system changes while we're re-indexing will be reflected.
  SearchHelper.set_alias_to_index(write_alias_name, new_index_name, false)

  # Reindex all users.
  User.find_in_batches do |batch|
    index.import batch.map { |m| m.to_elasticsearch_json }
  end
  index.refresh
  finished = true

  # Update the read and write aliases to only point at the newly re-indexed data.
  SearchHelper.set_alias_to_index read_alias_name, new_index_name
  SearchHelper.set_alias_to_index write_alias_name, new_index_name
ensure
  index.delete if defined?(index) && !finished
end

Сообщение с описанием этой стратегии можно найти здесь: http://www.mavengineering.com/blog/2014/02/12/seamless-elasticsearch-reindexing/

person AngelCabo    schedule 16.09.2014
comment
Я добавил примеры и резюме, описывающее технику, изложенную в опубликованной ссылке. Я использовал эту технику в своих приложениях, и она нам подходит. Дайте мне знать, если я могу добавить дополнительные пояснения. - person AngelCabo; 17.09.2014