Changelog
View SourceAll 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:
Dowser.Opensearch.Alias— the atomicupdate_aliases/2plus the single-alias put/delete/get/exists set.Dowser.Opensearch.Cat— all 24 CAT endpoints, including the OpenSearch-onlycluster_manager,pit_segmentsandsegment_replication.Dowser.Opensearch.Cluster— health, state, stats, settings, reroute, allocation explain, and the OpenSearch-only weighted routing and decommission awareness.Dowser.Opensearch.DanglingIndices— list, import and delete.Dowser.Opensearch.DataStream— create, get, delete, stats and modify.Dowser.Opensearch.Document— single-document CRUD, the exists/source pairs, bulk, multi-get and term vectors.Dowser.Opensearch.Index— index lifecycle, the resize trio, rollover, the maintenance endpoints, the monitoring reads andresolve_index/2.Dowser.Opensearch.IndexSettings— get and update.Dowser.Opensearch.IndexStateManagement— the ISM policy endpoints andrefresh_search_analyzers/2.Dowser.Opensearch.IndexTemplate— composable index templates, component templates and the legacy/_templateendpoints.Dowser.Opensearch.Info—info/1and theping/1pair.Dowser.Opensearch.List— OpenSearch's paginated counterpart to CAT indices and shards.Dowser.Opensearch.Mappings— put, get and get-field.Dowser.Opensearch.Reindex—_reindex, the two by-query operations and their_rethrottleendpoints.Dowser.Opensearch.Search— search, msearch, count, explain, field caps, search shards, validate query, the template endpoints, scroll and point-in-time.
Added — supporting layer
- The transport foundation:
Dowser.Opensearch.Client,Dowser.Opensearch.Error,Dowser.Opensearch.MappingErrorandDowser.Opensearch.Target. - The type-casting layer:
Dowser.Opensearch.Codecand its field codecs (Binary,Date,DateRange,GeoPoint,IP,Range), theMappabletraversal andDowser.Opensearch.MappingCacher. - Bulk payload handling:
Dowser.Opensearch.BulkandDowser.Opensearch.BulkError, which report a bulk request's per-item failures. Dowser.Opensearch.Repository— binds the index-related API functions to a fixed or computed index.Dowser.Opensearch.Streamer— walks a search as a lazyStreamover a point in time, withstream_slices/4for the parallel case.
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 toDowser.Opensearch.Target. Dowser.Opensearch.Streamerrequires asort. Elasticsearch has a_shard_docsort field made for tiebreaking a point-in-time walk, which its streamer appends for you. OpenSearch forked before that existed and never added it, andsearch_afteron 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_timerather than/_pit, and the id is namedpit_id; a delete wants it as an array, sodelete_pit/2wraps a single id. - By-query operations are
Reindex, notDocument. OpenSearch tags_delete_by_query,_update_by_queryand_reindextogether. validate_queryis a search endpoint here, where Elasticsearch tags itindices.- No
remove_block. OpenSearch has no endpoint for it; clear the correspondingindex.blocks.*setting instead. flat_objectis treated as opaque alongside Elasticsearch'sflattened, so its keys never reach the atom table.