Changelog

View Source

All notable changes to this project are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.1.0] - 2026-09-26

The first release: an Elixir client for the OpenSearch API, built on Dowser.Client and modelled on dowser_elasticsearch.

Added — API modules

One module per tag of the OpenSearch OpenAPI specification, each covering the common operations of its tag:

Added — supporting layer

Notes for dowser_elasticsearch users

The API surface follows the same conventions, but OpenSearch is not Elasticsearch and a few things differ on purpose:

  • Finer-grained modules. Elasticsearch tags index management, mappings, settings, aliases and templates alike as indices; OpenSearch splits them, so each gets its own module. The index-target helper they share moved from the indices module to Dowser.Opensearch.Target.
  • Dowser.Opensearch.Streamer requires a sort. Elasticsearch has a _shard_doc sort field made for tiebreaking a point-in-time walk, which its streamer appends for you. OpenSearch forked before that existed and never added it, and search_after on a non-unique final key silently skips or repeats documents — so the sort is the caller's to give, and a missing one raises rather than producing a walk that loses rows.
  • Point-in-time lives elsewhere. /_search/point_in_time rather than /_pit, and the id is named pit_id; a delete wants it as an array, so delete_pit/2 wraps a single id.
  • By-query operations are Reindex, not Document. OpenSearch tags _delete_by_query, _update_by_query and _reindex together.
  • validate_query is a search endpoint here, where Elasticsearch tags it indices.
  • No remove_block. OpenSearch has no endpoint for it; clear the corresponding index.blocks.* setting instead.
  • flat_object is treated as opaque alongside Elasticsearch's flattened, so its keys never reach the atom table.