OpenSearch vs. Elasticsearch Today

If you learned this engine as Elasticsearch, most of your mental model still works: Lucene segments, shards and replicas, the inverted index, BM25, the cluster-state model, the query DSL. OpenSearch began as a fork of that codebase, so the bones are shared. This page is for porting that mental model forward — it catalogs where OpenSearch has evolved or diverged since the fork, so you stop being surprised by cluster_manager, segment replication, and the _plugins/_* surface.

Discipline: This page describes what OpenSearch has, with the divergence point named. It does not claim what Elasticsearch's current internals look like — those are a separate, independently-evolving codebase, and overclaiming there would be wrong as often as right. Read every row as "OpenSearch has X (since version Y)," not "Elasticsearch lacks X."


The fork point

FactDetail
Forked fromElasticsearch 7.10.2 (and Kibana 7.10.2 → OpenSearch Dashboards)
WhenAnnounced 2021; OpenSearch 1.0 GA July 2021
WhyElastic relicensed Elasticsearch/Kibana away from Apache-2.0; AWS and partners forked the last Apache-2.0 release to keep an open-source distribution
License (OpenSearch)Apache License 2.0
License (post-7.10 Elasticsearch)dual SSPL + Elastic License (Elastic later also added an AGPL-3 option for Elasticsearch in 2024); these are not OSI "open source" in the SSPL/Elastic-License form OpenSearch forked away from
Governance (now)the OpenSearch Software Foundation, a directed fund of the Linux Foundation (moved from AWS sole stewardship to the LF in 2024)

Because the divergence point is a single known commit (7.10.2), you can often read OpenSearch internals as "7.10-era Lucene/ES architecture plus everything in the tables below." The package names changed from org.elasticsearch.* to org.opensearch.* in a mechanical rename early in the fork; almost every class you'll grep for keeps its short name.


What OpenSearch has built since the fork

Each of these is an OpenSearch capability with a chapter in this book. Frame them as additions/divergences from the 7.10.2 baseline.

OpenSearch featureWhat it isSinceRead
cluster_manager terminologythe elected coordinating node and its APIs/settings renamed from "master" → "cluster_manager" (old names kept as deprecated aliases)2.0discovery-coordination.md
Segment replicationreplicas copy finished segment files from the primary instead of re-indexing each doc (document replication); much cheaper write path, near-real-time copy2.x (GA 2.x)replication.md
Remote-backed storagetranslog + segments durably backed to a remote store (e.g. S3); enables cheaper durability and faster recovery/restore2.xremote-store-and-durability.md
Concurrent segment searcha single shard's segments searched in parallel across slices via CollectorManager (slice → reduce); default-on in 3.0GA 2.x, default 3.0concurrent-segment-search/index.md
Star-tree indexa precomputed multi-field aggregation tree that answers eligible aggregations without scanning docs2.x (experimental → GA)star-tree-aggregations.md
Tiered cachinga pluggable, multi-tier request cache (on-heap + disk via a spillover store) to keep more results cached than heap allows2.xtiered-caching.md
Built-in Security (free)TLS, authn/authz, RBAC, DLS/FLS/field-masking, audit — shipped and free in the default distribution, not a paid tier1.0security/index.md
k-NN / vector searchnative HNSW (Lucene engine) + faiss/nmslib engines via JNI, quantization (SQ/PQ/BQ), warmup, disk-ANN1.0+knn/index.md, vector-internals/index.md
neural-searchneural / hybrid / neural_sparse query clauses; semantic + lexical retrieval with score normalization2.xvectorization-embeddings/index.md
ml-commonsin-cluster model registration/deployment/inference; the substrate neural-search and agents call1.x+vectorization-embeddings/index.md
Reader/writer separation & search replicasseparate the indexing (writer) role from search-only (reader) replicas so search scales independently of indexing2.x → ongoingreplication.md, sharding-and-scaling.md
protobuf / gRPC transportan effort to add a protobuf-defined gRPC transport alongside the classic 9300 binary transport, for cross-language clients and efficiencyongoing (3.x)transport-layer.md

Note: Several of these (segment replication, remote store, reader/writer separation) are facets of one larger arc: decoupling durability and search from the local indexing path, so storage and search scale independently. If you internalize that arc, the individual features stop looking like a grab-bag.


RFCs and tracking issues

Cited by full URL so you can read the design rationale firsthand:

TopicIssue / RFC
Reader/writer separation (search replicas)https://github.com/opensearch-project/OpenSearch/issues/15306
k-NN GPU index buildhttps://github.com/opensearch-project/k-NN/issues/2293
k-NN remote index buildhttps://github.com/opensearch-project/k-NN/issues/2294

For anything else, search the relevant repo's issues with a RFC/[META] label filter rather than trusting a memorized number:

gh issue list --repo opensearch-project/OpenSearch --search "RFC segment replication in:title"
gh issue list --repo opensearch-project/OpenSearch --search "label:RFC"
gh issue list --repo opensearch-project/k-NN --search "RFC in:title"

Naming / terminology differences

The single most common source of "wait, that's not what I typed" when moving from an Elasticsearch mental model. Old names are generally retained as deprecated aliases, so both work, but new code, settings, and docs use the right column.

Older / Elasticsearch-era termOpenSearch termWhere it shows up
master (node, role)cluster_manager node / rolenode.roles: [cluster_manager], discovery-coordination.md
_cat/master_cat/cluster_managerREST endpoint map
cluster.initial_master_nodescluster.initial_cluster_manager_nodesbootstrap settings
master_timeout (param)cluster_manager_timeout (old still accepted)cluster/index admin requests
discovery.zen.* (legacy)modern cluster.* coordination settingsdiscovery-coordination.md
org.elasticsearch.*org.opensearch.*every Java package
elasticsearch.ymlopensearch.ymlnode config file
x-pack security/featuresbuilt-in Security plugin + _plugins/_*security/index.md
ELASTIC_PASSWORD, elastic userOPENSEARCH_INITIAL_ADMIN_PASSWORD, admin userbootstrap / demo config
KibanaOpenSearch DashboardsUI
Elastic Common Schema tie-insvendor-neutral; Data Prepper / OpenTelemetry ingestobservability

Warning: "Deprecated alias" means works now, warns, may be removed. When you contribute, use the cluster_manager spelling in new code, settings, tests, and docs — reviewers will ask you to. When you operate a cluster, prefer the new names so you don't carry deprecation debt.


Where the architecture is genuinely the same

So you don't over-rotate: the load-bearing core is shared lineage and behaves the way your Elasticsearch instinct expects.

Still the same shapeNotes
Lucene as the storage/search enginesame segments, codecs, file formats — segments-and-codecs.md, Lucene file formats
Shards + replicas, routing by _routing/_idsharding-and-scaling.md
Cluster-state model, two-phase publish, quorum-based coordinationcluster-state.md, cluster-state-publishing.md
The REST → action → transport request pathrest-layer.md, action-framework.md, transport-layer.md
Query DSL, QueryBuilder → Lucene Query, BM25 scoringquery-dsl-querybuilders.md, query-engine/index.md
Aggregation framework (Aggregator, reduce on the coordinator)aggregations.md
Refresh / flush / merge, translog durabilityrefresh-flush-merge.md, translog.md
Circuit breakers, thread pools, plugin SPIcircuit-breakers-memory.md, threadpools-concurrency.md, plugin-architecture.md

The shared baseline is 7.10.2-era. Anything that landed in Elasticsearch after the fork is not in OpenSearch (and vice-versa) unless independently re-implemented; the two codebases have diverged for years now.


If you're coming from Elasticsearch, read these chapters

A directed reading path that maps "the thing you already know" to "where OpenSearch differs or has grown."

You know / you're looking forStart hereThen
how leader election / "master" worksdiscovery-coordination.mddistributed-consensus/index.md — and re-train your tongue to say cluster_manager
replicas re-index every doc (document replication)replication.mdremote-store-and-durability.md — segment replication + remote store
paid security tiersecurity/index.mdsecurity/lab-01-authn-tls.md, security/lab-02-authz-dls-fls.md
vector search / dense retrievalknn/index.mdvector-internals/index.md, hnsw-vector-search.md
semantic / hybrid searchvectorization-embeddings/index.mdthe neural/hybrid rows in the REST endpoint map
search felt single-threaded per shardconcurrent-segment-search/index.mdnote it's default-on in 3.0
expensive aggregationsstar-tree-aggregations.mdaggregations/index.md, tiered-caching.md
where are the endpoints / handlersREST endpoint maprest-layer.md
on-disk file zooLucene file formatssegments-and-codecs.md
how do I even contributecontributor-mindsetissue-roadmap, release-governance

Practical migration notes

Small things that bite when you point Elasticsearch habits at OpenSearch:

  • Config file & env vars: opensearch.yml, not elasticsearch.yml; set OPENSEARCH_INITIAL_ADMIN_PASSWORD for the demo security config.
  • Settings names: prefer cluster_manager/cluster.initial_cluster_manager_nodes; cluster_manager_timeout over master_timeout. Old names warn.
  • Security is on by default in the standard distribution — your first curl needs -u admin:... -k (TLS + basic auth). security/lab-01-authn-tls.md explains the securityadmin.sh + YAML config flow.
  • Clients: use the OpenSearch language clients (opensearch-py, opensearch-java, ...). Some Elasticsearch clients added version checks that reject non-Elasticsearch servers; OpenSearch clients don't.
  • Replication strategy is a choice: document replication (classic) vs segment replication is an index setting — pick deliberately based on write-heaviness.
  • Version math is independent: OpenSearch major/minor numbers do not line up with Elasticsearch's. "Which Lucene?" is the better cross-reference — grep the build for the Lucene version both sides happen to be on.

Note: Be respectful and precise when you write or talk about the two projects — many contributors work across the ecosystem, and the histories are entangled. State facts (license, fork point, what each has) and cite RFCs; avoid editorializing about motives. This book's job is to make you effective in the OpenSearch codebase.


First contact: the same requests, the OpenSearch way

The fastest way to recalibrate is to run the requests you already know and watch for the differences.

# Security is on by default in the standard distribution: TLS + basic auth.
# (-k accepts the demo self-signed cert; never -k against production.)
curl -sk -u admin:"$OPENSEARCH_INITIAL_ADMIN_PASSWORD" 'https://localhost:9200'

# Who is the elected coordinator? Note the path: cluster_manager, not master.
curl -sk -u admin:"$PW" 'https://localhost:9200/_cat/cluster_manager?v'

# Is this index using segment replication? Look for the replication.type setting.
curl -sk -u admin:"$PW" \
  'https://localhost:9200/my-index/_settings?filter_path=**.replication' | python3 -m json.tool

# Segment-replication lag (empty unless replication.type=SEGMENT):
curl -sk -u admin:"$PW" 'https://localhost:9200/_cat/segment_replication?v'

# Concurrent segment search status (default-on in 3.0):
curl -sk -u admin:"$PW" \
  'https://localhost:9200/_cluster/settings?include_defaults&filter_path=**.concurrent_segment_search'

# Who am I, per the security plugin's authc/authz chain?
curl -sk -u admin:"$PW" 'https://localhost:9200/_plugins/_security/authinfo?pretty'

# Which plugins are installed? (k-NN, security, neural-search, ml-commons, ...)
curl -sk -u admin:"$PW" 'https://localhost:9200/_cat/plugins?v'
Surprise vs an Elasticsearch habitWhy
curl localhost:9200 hangs / refuses without -k -usecurity is on by default; it's HTTPS + basic auth, not plaintext
_cat/master warns about deprecationrenamed to _cat/cluster_manager
_cat/segment_replication returns no rowsthe index uses document replication, not segment replication
_plugins/_knn/*, _plugins/_security/* existthese are first-party plugins in the default distribution, not a paid add-on
your ES client throws a "not Elasticsearch" / version erroruse the OpenSearch clients (opensearch-py, opensearch-java) instead

One layer deeper on the headline divergences

DivergenceThe one thing to internalizeWhere it changes contributor work
document → segment replicationreplicas copy finished segment files, not re-run indexing — write amplification drops, but replicas need the primary's segments shipped to themrecovery, the engine, remote store
local → remote-backed durabilitythe translog and segments can live in object storage; durability decouples from the local diskremote-store-and-durability.md, translog.md
serial → concurrent segment searcha shard's segments are sliced and searched in parallel; collectors must be slice-safe via CollectorManagerevery new aggregation/collector you write — concurrent-segment-search/index.md
scan → star-tree aggregationseligible aggregations read a precomputed tree instead of scanning docsstar-tree-aggregations.md
coupled reader+writer → separationsearch-only replicas scale search independently of indexing (RFC 15306)replication.md, sharding-and-scaling.md