I have a Post model:
class Post < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
  # I WANT THIS FUNCTION EXECUTED ON index1
  def self.search1(query)
      __elasticsearch__.search(
        {
        query:
        }
      )
  end
  # I WANT THIS FUNCTION EXECUTED ON index2
  def self.search2(query)
      __elasticsearch__.search(
        {
        query:
        }
      )
  end
  index_name  "index1" 
  # I NEED ANOTHER INDEX ? HOW CAN I DO ?  
  settings index1: { number_of_shards: 1 } do
    mappings dynamic: 'false' do
      indexes :title, analyzer: 'english'
    end
  end
end
Post.__elasticsearch__.client.indices.delete index: "index1" rescue nil
Post.__elasticsearch__.client.indices.create index: "index1", body: { settings: Post.settings.to_hash, mappings: Post.mappings.to_hash }
Post.import
I have 1 model, 2 very different functions which need a completely different index.
How can I build 2 different indices in 1 model and tell the __elasticsearch__.search which index it should use ?
You know you can use 2 models for the same database table right? I'd use a concern for the shared methods and one model per index, that or 3 models, one for regular use and the 2 others specifically for the indexes. It might feel like a hack at first but that might be a cleaner solution in the end. Let me know how it goes :p
Although a bit late, I came across this question when trying to find a solution for the same problem. In my case I needed multilanguage support for a model and elasticsearch.
In config/initializers/elasticsearch.rb we override __type_for_hit to avoid index_name matching   
module Elasticsearch
  module Model
    module Adapter
      module Multiple
        module Records
          def __type_for_hit(hit)
            @@__types ||= {}
            @@__types[ "#{hit[:_index]}::#{hit[:_type]}" ] ||= begin
            Registry.all.detect do |model|
              model.document_type == hit[:_type]
            end
          end
        end
      end
   end
end
Then in our Model
def self.mappings
  {
   :post => {
     :dynamic => "false",
     :properties => {
       :name => {
         :type          => "text",
         :analyzer      => "english"
        }
      }
    }
  }
end
class Elastic
   def initialize locale
      @locale = locale
   end
   def index_name
      "posts-" + @locale    
   end
   def document_type
      "post"
   end
end  
mappings allows us to create indexes like:
Post.__elasticsearch__.client.indices.create index: "posts-en", body: { mappings: Post.mappings.to_hash }
Then, in order to import documents:
Post.import index:'posts-en'
Notice that you can define mappings as a function and create as many different indexes as you want. Finally you can search across an index or multiple indexes like:
Elasticsearch::Model.search('my_query', [Post::Elastic.new('en'), Post::Elastic.new('es') ]).records
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With