# Changelog
## v0.10.0 - 2025-03-10
### New
Added the `synonyms` settings to the `Algoliax.Indexer`.
It allows you to automatically setup synonyms for your indexes when calling `MyIndexer.configure_index()`
If not specified or set to `nil`, the synonyms will not be configured.
Otherwise, the following keywords are expected, with each key having a default value:
- `synonyms`: a list of synonym groups, as expected by Algolia. Default `[]`
- `replace_existing_synonyms`: Whether to replace existing synonyms. Default `true`
- `forward_to_replicas`: Whether to forward synonyms to replicas. Default `true`
You can also provide an arity-1 function (that takes the `index_name`) that returns the same keyword list.
If using `forward_to_replicas: true`, make sure not to specify synonyms on the replicas themselves to avoid conflicts/overwrites.
```elixir
defmodule Global do
use Algoliax.Indexer,
index_name: :people,
object_id: :reference,
schemas: People,
algolia: [
attribute_for_faceting: ["age"],
custom_ranking: ["desc(updated_at)"]
]
synonyms: [
synonyms: [
%{
objectID: "synonym1",
type: "synonym",
synonyms: ["pants", "trousers", "slacks"],
...
},
%{
objectID: "synonym2",
...
}
],
forward_to_replicas: false,
replace_existing_synonyms: false
]
end
```
### Other changes
- Updated the list of supported algolia settings.
## v0.9.1 - 2024-12-12
### New
The `Algoliax.Indexer` now supports dynamic definition for the `:algolia` settings. It can supports 2 types of configurations:
- (Existing) Keyword list
- (New) Name of a 0-arity function that returns a keyword list
```elixir
defmodule People do
use Algoliax.Indexer,
index_name: :people,
object_id: :reference,
schemas: [People],
algolia: :runtime_algolia
def runtime_algolia do
[
attribute_for_faceting: ["age"],
custom_ranking: ["desc(updated_at)"]
]
end
end
```
Also added 2 new exceptions for the `:algolia` configuration: `InvalidAlgoliaSettingsFunctionError` and `InvalidAlgoliaSettingsConfigurationError`
### Other changes
Existing direct calls to `Algoliax.Settings.replica_settings/2` will still work but will not benefit from
the dynamic `:algolia` configuration. Please use `Algoliax.Settings.replica_settings/3` instead.
## v0.9.0 - 2024-11-26
`ALGOLIA_API_KEY` and `ALGOLIA_APPLICATION_ID` aren't read anymore from system env variables
inside the code. Only application config is now used (as documented).
If you used these env vars, you should now read them inside the config:
```elixir
config :algoliax,
api_key: System.get_env("ALGOLIA_API_KEY"),
application_id: System.get_env("ALGOLIA_APPLICATION_ID)
```
## v0.8.3 - 2024-10-18
New `if` option for replicas which decides if they should be updated or not.
- **If not provided**, the replica will be updated (so no impact on existing configurations)
- Must be `nil|true|false` or the name (atom) of a arity-0 func which returns a boolean
- If provided, the replica will be updated only if the value is `true` or the function returns `true`
Useful for Algolia's A/B testing which requires replicas and only deploy them in production.
## v0.8.2 - 2024-09-16
- Upgrading all dependencies
- Added `dependabot` to the repository
## v0.8.1 - 2024-09-11
#### New
- Added new **optional** settings `default_filters` to be applied automatically when calling `reindex` without query
or `reindex_atomic`. Defaults to `%{}` which was the previous behavior.
```elixir
defmodule BlondeBeerIndexer do
use Algoliax.Indexer,
index_name: :blonde_beers,
object_id: :name,
schemas: [Beer],
default_filters: %{where: [kind: "blonde"]} # <--- can be a map
end
defmodule BeerIndexer do
use Algoliax.Indexer,
index_name: :various_beers,
object_id: :name,
schemas: [Beer1, Beer2, Beer3],
default_filters: :get_filters # <--- can be a function
def get_filters do
%{
Beer1 => %{where: [kind: "blonde"]}, # <--- custom filter for Beer1
:where => [kind: "brune"] # <--- Will be used for Beer2 and Beer3
}
end
end
```
#### Contributing
- New `CONTRIBUTING.md` file
- Simplified the `config/test.exs` file
- Provide a `.env.example` file to help contributors to setup their environment
## v0.8.0 - 2024-09-11
#### Breaking changes
- Errors for `get_object` and `get_objects` are now of arity 4 and returns the original request as last attribute
#### New
- Added possibility to have multiple indexes for a model (applies for replicas as well)
- Added `build_object/2` with the index name as second parameter (useful for translations for example)
## v0.7.2 - 2023-09-18
#### Breaking changes
- require Elixir >= 1.15 and OTP 26
## v0.7.1 - 2022-03-29
#### New
- Add wait_task/1 (<https://hexdocs.pm/algoliax/Algoliax.html#wait_task/1>)
## v0.7.0 - 2022-03-29
#### Breaking changes
- Indexer operation returns a `%Algoliax.Reponse{}` (#51)
#### Bug fix
- Ensure clean up on reindex fail
## v0.6.0 - 2021-06-10
#### Updates
- Replace deprecated `hmac` function with new :crypto API `mac` function to support OTP-24
#### Breaking changes
- Drop support for OTP 21. OTP 22+ is now required.
## v0.5.0 - 2021-03-04
#### New
- [Welcome to the Jungle](https://www.welcometothejungle.com) became the owner :tada:
- Add ability to define replicas
- Raise when Algolia API error
#### Breaking changes
- `generate_secured_api_key/1` is removed in favor of `generate_secured_api_key/2`
- Drop support of Elixir 1.9. Elixir 1.10 or greater required
#### Updates
- update hackney to 1.17
## v0.4.3 - 2020-08-31
#### New
- add ability to customize objectID by overriding `get_object_id/1`
#### Improvement
- Make sure index is configured before any action.
## v0.4.2 - 2020-05-14
#### New
- add ability to provide preloads for `reindex` and `reindex_atomic` function
```elixir
defmodule People do
use Algoliax.Indexer,
index_name: :people,
object_id: :reference,
schemas: [
{__MODULE__, [:animals]}
]
algolia: [
attribute_for_faceting: ["age"],
custom_ranking: ["desc(updated_at)"]
]
end
```
## v0.4.1 - 2020-05-01
#### New
- add `generate_secured_api_key!/1`
## v0.4.0 - 2020-04-24
#### New
- add ability configure `:recv_timeout` for hackney.
- add ability to pass query_filters or Ecto.Query to `reindex/2`.
```elixir
filters = %{where: [name: "John"]}
People.reindex(filters)
query = from(p in People, where: p.name == "john")
People.reindex(query)
```
#### breaking changes
- improved `generate_secured_api_key/1`
- remove attributes macros in favor of `build_object/1`
- remove `:prepare_object` options
- remove `:preloads` options
## v0.3.0 - 2020-04-04
#### New
- add `prepare_object` to modify object before send to algolia
- add ability to provide `build_object/1` instead of attributes
- add `schemas` option to override caller
#### Bug fix
- Fix pagination when `cursor_field` different than `:id`
- `delete_object/1` and `reindex` w/ `force_delete: true` don't need to build entire object
#### breaking changes
- change dependencies to optional (ecto)
- Move algoliax to algoliax/indexer.
```elixir
# old
use Algoliax,
...
# New
use Algoliax.Indexer,
...
```
- Move algolia specific settings into `:algolia` option
```elixir
# old
use Algoliax.Indexer,
index_name: :test,
attributes_for_faceting: ["age"],
searchable_attributes: ["full_name"],
custom_ranking: ["desc(updated_at)"],
...
# New
use Algoliax.Indexer,
index_name: :test,
algolia: [
attributes_for_faceting: ["age"],
searchable_attributes: ["full_name"],
custom_ranking: ["desc(updated_at)"]
],
...
```
## v0.2.0 - 2020-01-27
### Enhancements
- add option to customize column used to find records in batch (`cursor_field`)
- add preloads to find records in batch.