Replicas and multiple indices
Replica indices
Algolia uses one ranking strategy per index.
If you want to provide more ranking or sorting strategies,
add replica indices
with the add_replica method.
To inherit the settings from the primary index, add inherit:true.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Book < ActiveRecord::Base
  attr_protected
  include AlgoliaSearch
  algoliasearch per_environment: true do
    searchableAttributes [:name, :author, :editor]
    # Define a replica index to search by `author` only
    add_replica 'Book_by_author', per_environment: true do
      searchableAttributes [:author]
    end
    # define a replica index with custom ordering but same settings than the main block
    add_replica 'Book_custom_order', inherit: true, per_environment: true do
      customRanking ['asc(rank)']
    end
  end
end
Share a single index
If you want to share an index for multiple models,
make sure that your objectIDs are unique.
For example, you can prepend the model class name to the record’s id:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Student < ActiveRecord::Base
  attr_protected
  include AlgoliaSearch
  algoliasearch index_name: 'people', id: :algolia_id do
    # [...]
  end
  private
  def algolia_id
    "student_#{id}" # ensure the teacher & student IDs are not conflicting
  end
end
class Teacher < ActiveRecord::Base
  attr_protected
  include AlgoliaSearch
  algoliasearch index_name: 'people', id: :algolia_id do
    # [...]
  end
  private
  def algolia_id
    "teacher_#{id}" # ensure the teacher & student IDs are not conflicting
  end
end
To reindex a model that’s part of a shared index,
you must use Model.reindex! instead of Model.reindex.
If you use reindex, the resulting index would only contain records for the current model.
For more information, see Zero-downtime indexing
Target multiple indices
To index records in several indices, use the add_index method.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Book < ActiveRecord::Base
  attr_protected
  include AlgoliaSearch
  PUBLIC_INDEX_NAME  = "Book_#{Rails.env}"
  SECURED_INDEX_NAME = "SecuredBook_#{Rails.env}"
  # store all books in index 'SECURED_INDEX_NAME'
  algoliasearch index_name: SECURED_INDEX_NAME do
    searchableAttributes [:name, :author]
    # convert security to tags
    tags do
      [released ? 'public' : 'private', premium ? 'premium' : 'standard']
    end
    # store all 'public' (released and not premium) books in index 'PUBLIC_INDEX_NAME'
    add_index PUBLIC_INDEX_NAME, if: :public? do
      searchableAttributes [:name, :author]
    end
  end
  private
  def public?
    released && !premium
  end
end