2013-04-09 1 views
2

Я понимаю переиндексации используя псевдоним, чтобы избежать простоев, как описано здесь: Is there a smarter way to reindex elasticsearch?Повторная ссылка Elasticsearch: как вы перенаправляете новый индекс во время его создания?

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

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

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

ответ

1

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

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

У вас есть старый INDEX1

Нажмите все материалы для index2 Добавить индекс псевдонима на вершине iNDEX1, index2

Когда индексация закончена удалить index1

-1

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

Определите псевдонимы для операций чтения и записи, которые будут указывать на индекс 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/

+0

Я добавил примеры и резюме с описанием методики, описанной в ссылке публикуемую. Я использовал эту технику в своих приложениях, и она хорошо работает для нас. Дайте мне знать, если есть дополнительное разъяснение, которое я могу добавить. – AngelCabo