Integrations / Frameworks / Rails / Index Settings
Mar. 22, 2019

Index Settings

Index names

The index name will be automatically deduced from the class name. You can customize the index name by passing a string to the index_name option.

1
2
3
4
5
6
7
class Contact < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch index_name: "MyCustomName" do
    attribute :first_name, :last_name, :email
  end
end

Per-environment indices

In most cases, you’ll have your production indices and you development indices under the same Algolia app.

To make sure you don’t modify your production data while developing, this gem can automatically suffix the index name with the current Rails environment, turning the Contact index to Contact_#{Rails.env}.

It’s also highly recommended to use API keys with index restrictions. For instance, when developing, you would use a key that can only write on indices with names ending in _development and _development.tmp. The tmp index is required when using atomic reindexing. This restriction will make it impossible to write on your production index.

1
2
3
4
5
6
7
class Contact < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch per_environment: true do
    attribute :first_name, :last_name, :email
  end
end

Index settings

Algolia offers many settings to fine-tune your search. You can find all the available settings in our documentation. Settings will either help with relevance or with displaying results. This gem lets you set all your index settings inside the algoliasearch.

This page will show some common use cases like faceting or distinct.

Relevancy 101

If you don’t want to spend time going over all the settings yet, it’s highly recommended to at least set the searchableAttributes and customRanking settings. Those two will already improve relevancy a lot by reflecting record popularity and ignoring technical attributes (like image URLs or dates).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Product < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch do
    # list of attribute used to build an Algolia record
    attributes :title, :subtitle, :description, :likes_count, :thumbnail_url, :release_date

    # the `searchableAttributes` (formerly known as attributesToIndex) setting defines the attributes
    # you want to search in: here `title`, `subtitle` & `description`.
    # You need to list them by order of importance. `description` is tagged as
    # `unordered` to avoid taking the position of a match into account in that attribute.
    searchableAttributes ['title', 'subtitle', 'unordered(description)']

    # the `customRanking` setting defines the ranking criteria use to compare two matching
    # records in case their text-relevance is equal. It should reflect your record popularity.
    customRanking ['desc(likes_count)']
  end

end

Faceting

If you intend to do filtering or faceting, you must register the necessary attributes in the settings, under attributesForFaceting. To be so fast, Algolia computes a lot of things at indexing time, rather than query time, so the engine must know in advance what will be used for filtering and faceting.

If you have a lot of facet values, you can even make a facet searchable (like categories in the following example).

In the same vein, you may want to look at numericAttributesForFiltering.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Product < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch do
    # list of attribute used to build an Algolia record
    attributes :title, :subtitle, :likes_count, :ratings, :categories, :features, :sizes

    # ... Other settings removed for brevity

    attributesForFaceting ['searchable(categories)', 'features', 'sizes']
    numericAttributesForFiltering ['likes_count', 'equalOnly(ratings)']
  end

end

Synonyms

Currently, this gem only support regular synonyms where all words are mutually equivalent: “Pants” = “trousers” and “trousers” = “pants”.

1
2
3
4
5
6
7
8
9
10
class Contact < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch do
    attributes :first_name, :email

    synonyms [ ['bob', 'bobby' 'robert'] ]

  end
end

If you wish to use any other type of synonym, you can do so by using the underlying index of the model and the save_synonym or batch_synonyms method.

Did you find this page helpful?