What Is Elasticsearch
What Is Elasticsearch
Linux and The tar.gz archives are available for installation on any Linux distribution
MacOS tar.gz archives MacOS.
Install Elasticsearch from archive on Linux or MacOS
Windows .zip archive The zip archive is suitable for installation on Windows.
Install Elasticsearch with .zip on Windows
deb The deb package is suitable for Debian, Ubuntu, and other Debian-based
systems. Debian packages may be downloaded from the Elasticsearch
website or from our Debian repository.
Install Elasticsearch with Debian Package
rpm The rpm package is suitable for installation on Red Hat, Centos, SLES,
OpenSuSE and other RPM-based systems. RPMs may be downloaded from
Elasticsearch website or from our RPM repository.
Install Elasticsearch with RPM
For a step-by-step example of setting up the Elastic Stack on your own premises, try
out our tutorial: Installing a self-managed Elastic Stack.
Elasticsearch container images
You can also run Elasticsearch inside a container image.
docker Docker container images may be downloaded from the Elastic Docker Registry.
Install Elasticsearch with Docker
Java (JVM) Version
Elasticsearch is built using Java, and includes a bundled version of OpenJDK from
the JDK maintainers (GPLv2+CE) within each distribution. The bundled JVM is the
recommended JVM.
To use your own version of Java, set the ES_JAVA_HOME environment variable. If you
must use a version of Java that is different from the bundled JVM, it is best to use
the latest release of a supported LTS version of Java. Elasticsearch is closely coupled
to certain OpenJDK-specific features, so it may not work correctly with other JVMs.
Elasticsearch will refuse to start if a known-bad version of Java is used.
If you use a JVM other than the bundled one, you are responsible for reacting to
announcements related to its security issues and bug fixes, and must yourself
determine whether each update is necessary or not. In contrast, the bundled JVM is
treated as an integral part of Elasticsearch, which means that Elastic takes
responsibility for keeping it up to date. Security issues and bugs within the bundled
JVM are treated as if they were within Elasticsearch itself.
The bundled JVM is located within the jdk subdirectory of the Elasticsearch home
directory. You may remove this directory if using your own JVM.
JVM and Java agents
Don’t use third-party Java agents that attach to the JVM. These agents can reduce
Elasticsearch performance, including freezing or crashing nodes.
Install Elasticsearch with Docker
Docker images for Elasticsearch are available from the Elastic Docker registry. A list
of all published Docker images and tags is available at www.docker.elastic.co. The
source code is in GitHub.
This package contains both free and subscription features. Start a 30-day trial to try
out all of the features.
If you just want to test Elasticsearch in local development, refer to Local dev setup
(Docker). Please note that this setup is not suitable for production environments.
Run Elasticsearch in Docker
Use Docker commands to start a single-node Elasticsearch cluster for development
or testing. You can then run additional Docker commands to add nodes to the test
cluster or run Kibana.
This setup doesn’t run multiple Elasticsearch nodes or Kibana by default. To create a
multi-node cluster with Kibana, use Docker Compose instead. See Start a multi-node
cluster with Docker Compose.
Start a single-node cluster
1. Install Docker. Visit Get Docker to install Docker for your environment.
If using Docker Desktop, make sure to allocate at least 4GB of memory. You can
adjust memory usage in Docker Desktop by going to Settings > Resources.
2. Create a new docker network.
docker network create elastic
3. Pull the Elasticsearch Docker image.
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.14.3
4. Optional: Install Cosign for your environment. Then use Cosign to verify the
Elasticsearch image’s signature.
5. wget https://artifacts.elastic.co/cosign.pub
cosign verify --key cosign.pub docker.elastic.co/elasticsearch/elasticsearch:8.14.3
The cosign command prints the check results and the signature payload in JSON
format:
Verification for docker.elastic.co/elasticsearch/elasticsearch:8.14.3 --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- Existence of the claims in the transparency log was verified offline
- The signatures were verified against the specified public key
6. Start an Elasticsearch container.
docker run --name es01 --net elastic -p 9200:9200 -it -m 1GB
docker.elastic.co/elasticsearch/elasticsearch:8.14.3
Use the -m flag to set a memory limit for the container. This removes the need
to manually set the JVM size.
The command prints the elastic user password and an enrollment token for Kibana.
7. Copy the generated elastic password and enrollment token. These credentials
are only shown when you start Elasticsearch for the first time. You can
regenerate the credentials using the following commands.
8. docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password
-u elastic
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-
token -s kibana
We recommend storing the elastic password as an environment variable in your
shell. Example:
export ELASTIC_PASSWORD="your_password"
9. Copy the http_ca.crt SSL certificate from the container to your local machine.
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
10.Make a REST API call to Elasticsearch to ensure the Elasticsearch container is
running.
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200
Add more nodes
1. Use an existing node to generate a enrollment token for the new node.
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-
token -s node
The enrollment token is valid for 30 minutes.
2. Start a new Elasticsearch container. Include the enrollment token as an
environment variable.
docker run -e ENROLLMENT_TOKEN="<token>" --name es02 --net elastic -it -m 1GB
docker.elastic.co/elasticsearch/elasticsearch:8.14.3
3. Call the cat nodes API to verify the node was added to the cluster.
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD
https://localhost:9200/_cat/nodes
Run Kibana
1. Pull the Kibana Docker image.
docker pull docker.elastic.co/kibana/kibana:8.14.3
2. Optional: Verify the Kibana image’s signature.
3. wget https://artifacts.elastic.co/cosign.pub
cosign verify --key cosign.pub docker.elastic.co/kibana/kibana:8.14.3
4. Start a Kibana container.
docker run --name kib01 --net elastic -p 5601:5601
docker.elastic.co/kibana/kibana:8.14.3
5. When Kibana starts, it outputs a unique generated link to the terminal. To
access Kibana, open this link in a web browser.
6. In your browser, enter the enrollment token that was generated when you
started Elasticsearch.
To regenerate the token, run:
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-
token -s kibana
7. Log in to Kibana as the elastic user with the password that was generated
when you started Elasticsearch.
To regenerate the password, run:
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u
elastic
Remove containers
To remove the containers and their network, run:
# Remove the Elastic network
docker network rm elastic
# Default settings from JEP 158, but with `utctime` instead of `uptime` to match
the next line
-Xlog:all=warning:stderr:utctime,level,tags
Anatomy of an analyzer
An analyzer — whether built-in or custom — is just a package which contains
three lower-level building blocks: character filters, tokenizers, and token
filters.
Character filters
A character filter receives the original text as a stream of characters and can
transform the stream by adding, removing, or changing characters. For
instance, a character filter could be used to convert Hindu-Arabic numerals (٠١
٢٣٤٥٦٧٨٩) into their Arabic-Latin equivalents (0123456789), or to strip HTML
elements like <b> from the stream.
An analyzer may have zero or more character filters, which are applied in
order.
Tokenizer
A tokenizer receives a stream of characters, breaks it up into
individual tokens (usually individual words), and outputs a stream of tokens.
For instance, a whitespace tokenizer breaks text into tokens whenever it sees
any whitespace. It would convert the text "Quick brown fox!" into the
terms [Quick, brown, fox!].
The tokenizer is also responsible for recording the order or position of each
term and the start and end character offsets of the original word which the
term represents.
An analyzer must have exactly one tokenizer.
Token filters
A token filter receives the token stream and may add, remove, or change
tokens. For example, a lowercase token filter converts all tokens to
lowercase, a stop token filter removes common words (stop words)
like the from the token stream, and a synonym token filter introduces
synonyms into the token stream.
Token filters are not allowed to change the position or character offsets of
each token.
An analyzer may have zero or more token filters, which are applied in
order.
quick X X
brown X
fox X X
jump X
over X
dog X
Because the field value and query string were analyzed in the same way, they
created similar tokens. The tokens quick and fox are exact matches. This means the
search matches the document containing "The QUICK brown foxes jumped over the
dog!", just as the user expects.
When to use a different search analyzer
While less common, it sometimes makes sense to use different analyzers at index
and search time. To enable this, Elasticsearch allows you to specify a separate
search analyzer.
Generally, a separate search analyzer should only be specified when using the same
form of tokens for field values and query strings would create unexpected or
irrelevant search matches.
Example
Elasticsearch is used to create a search engine that matches only words that start
with a provided prefix. For instance, a search for tr should return tram or trope—but
never taxi or bat.
A document is added to the search engine’s index; this document contains one such
word in a text field:
"Apple"
The index analyzer for the field converts the value into tokens and normalizes them.
In this case, each of the tokens represents a potential prefix for the word:
[ a, ap, app, appl, apple]
These tokens are then indexed.
Later, a user searches the same text field for:
"appli"
The user expects this search to match only words that start with appli, such
as appliance or application. The search should not match apple.
However, if the index analyzer is used to analyze this query string, it would produce
the following tokens:
[ a, ap, app, appl, appli ]
When Elasticsearch compares these query string tokens to the ones indexed
for apple, it finds several matches.
a X X
ap X X
app X X
Token appli apple
appl X X
appli X
This means the search would erroneously match apple. Not only that, it would
match any word starting with a.
To fix this, you can specify a different search analyzer for query strings used on
the text field.
In this case, you could specify a search analyzer that produces a single token rather
than a set of prefixes:
[ appli ]
This query string token would only match tokens for words that start with appli,
which better aligns with the user’s search expectations.
Stemming
Stemming is the process of reducing a word to its root form. This ensures variants of
a word match during a search.
For example, walking and walked can be stemmed to the same root word: walk.
Once stemmed, an occurrence of either word would match the other in a search.
Stemming is language-dependent but often involves removing prefixes and suffixes
from words.
In some cases, the root form of a stemmed word may not be a real word. For
example, jumping and jumpiness can both be stemmed to jumpi. While jumpi isn’t a
real English word, it doesn’t matter for search; if all variants of a word are reduced
to the same root form, they will match correctly.
Stemmer token filters
In Elasticsearch, stemming is handled by stemmer token filters. These token filters
can be categorized based on how they stem words:
Algorithmic stemmers, which stem words based on a set of rules
Dictionary stemmers, which stem words by looking them up in a dictionary
Because stemming changes tokens, we recommend using the same stemmer token
filters during index and search analysis.
Algorithmic stemmers
Algorithmic stemmers apply a series of rules to each word to reduce it to its root
form. For example, an algorithmic stemmer for English may remove the -s and -
es suffixes from the end of plural words.
Algorithmic stemmers have a few advantages:
They require little setup and usually work well out of the box.
They use little memory.
They are typically faster than dictionary stemmers.
However, most algorithmic stemmers only alter the existing text of a word. This
means they may not work well with irregular words that don’t contain their root
form, such as:
be, are, and am
mouse and mice
foot and feet
The following token filters use algorithmic stemming:
stemmer, which provides algorithmic stemming for several languages, some
with additional variants.
kstem, a stemmer for English that combines algorithmic stemming with a
built-in dictionary.
porter_stem, our recommended algorithmic stemmer for English.
snowball, which uses Snowball-based stemming rules for several languages.
Dictionary stemmers
Dictionary stemmers look up words in a provided dictionary, replacing unstemmed
word variants with stemmed words from the dictionary.
In theory, dictionary stemmers are well suited for:
Stemming irregular words
Discerning between words that are spelled similarly but not related
conceptually, such as:
organ and organization
broker and broken
In practice, algorithmic stemmers typically outperform dictionary stemmers. This is
because dictionary stemmers have the following disadvantages:
Dictionary quality
A dictionary stemmer is only as good as its dictionary. To work well, these
dictionaries must include a significant number of words, be updated regularly,
and change with language trends. Often, by the time a dictionary has been
made available, it’s incomplete and some of its entries are already outdated.
Size and performance
Dictionary stemmers must load all words, prefixes, and suffixes from its
dictionary into memory. This can use a significant amount of RAM. Low-quality
dictionaries may also be less efficient with prefix and suffix removal, which
can slow the stemming process significantly.
You can use the hunspell token filter to perform dictionary stemming.
If available, we recommend trying an algorithmic stemmer for your language before
using the hunspell token filter.
Control stemming
Sometimes stemming can produce shared root words that are spelled similarly but
not related conceptually. For example, a stemmer may reduce
both skies and skiing to the same root word: ski.
To prevent this and better control stemming, you can use the following token filters:
stemmer_override, which lets you define rules for stemming specific tokens.
keyword_marker, which marks specified tokens as keywords. Keyword tokens
are not stemmed by subsequent stemmer token filters.
conditional, which can be used to mark tokens as keywords, similar to
the keyword_marker filter.
For built-in language analyzers, you also can use the stem_exclusion parameter to
specify a list of words that won’t be stemmed.
Token graphs
When a tokenizer converts a text into a stream of tokens, it also records the
following:
The position of each token in the stream
The positionLength, the number of positions that a token spans
Using these, you can create a directed acyclic graph, called a token graph, for a
stream. In a token graph, each position represents a node. Each token represents an
edge or arc, pointing to the next position.
Synonyms
Some token filters can add new tokens, like synonyms, to an existing token stream.
These synonyms often span the same positions as existing tokens.
In the following graph, quick and its synonym fast both have a position of 0. They
span the same positions.
Multi-position tokens
Some token filters can add tokens that span multiple positions. These can include
tokens for multi-word synonyms, such as using "atm" as a synonym for "automatic
teller machine."
However, only some token filters, known as graph token filters, accurately record
the positionLength for multi-position tokens. These filters include:
synonym_graph
word_delimiter_graph
Some tokenizers, such as the nori_tokenizer, also accurately decompose compound
tokens into multi-position tokens.
In the following graph, domain name system and its synonym, dns, both have a
position of 0. However, dns has a positionLength of 3. Other tokens in the graph
have a default positionLength of 1.
The match_phrase query uses this graph to generate sub-queries for the following
phrases:
dns is fragile
domain name system is fragile
This means the query matches documents containing either dns is fragile or domain
name system is fragile.
Data streams
A data stream lets you store append-only time series data across multiple indices
while giving you a single named resource for requests. Data streams are well-suited
for logs, events, metrics, and other continuously generated data.
You can submit indexing and search requests directly to a data stream. The stream
automatically routes the request to backing indices that store the stream’s data. You
can use index lifecycle management (ILM) to automate the management of these
backing indices. For example, you can use ILM to automatically move older backing
indices to less expensive hardware and delete unneeded indices. ILM can help you
reduce costs and overhead as your data grows.
Should you use a data stream?
To determine whether you should use a data stream for your data, you should
consider the format of the data, and your expected interaction. A good candidate
for using a data stream will match the following criteria:
Your data contains a timestamp field, or one could be automatically
generated.
You mostly perform indexing requests, with occasional updates and deletes.
You index documents without an _id, or when indexing documents with an
explicit _id you expect first-write-wins behavior.
For most time series data use-cases, a data stream will be a good fit. However, if
you find that your data doesn’t fit into these categories (for example, if you
frequently send multiple documents using the same _id expecting last-write-wins),
you may want to use an index alias with a write index instead. See documentation
for managing time series data without a data stream for more information.
Keep in mind that some features such as Time Series Data Streams (TSDS) and data
stream lifecycles require a data stream.
Backing indices
A data stream consists of one or more hidden, auto-generated backing indices.
A data stream requires a matching index template. The template contains the
mappings and settings used to configure the stream’s backing indices.
Every document indexed to a data stream must contain a @timestamp field,
mapped as a date or date_nanos field type. If the index template doesn’t specify a
mapping for the @timestamp field, Elasticsearch maps @timestamp as a date field
with default options.
The same index template can be used for multiple data streams. You cannot delete
an index template in use by a data stream.
The name pattern for the backing indices is an implementation detail and no
intelligence should be derived from it. The only invariant the holds is that each data
stream generation index will have a unique name.
Read requests
When you submit a read request to a data stream, the stream routes the request to
all its backing indices.
Write index
The most recently created backing index is the data stream’s write index. The
stream adds new documents to this index only.
You cannot add new documents to other backing indices, even by sending requests
directly to the index.
You also cannot perform operations on a write index that may hinder indexing, such
as:
Clone
Delete
Shrink
Split
Rollover
A rollover creates a new backing index that becomes the stream’s new write index.
We recommend using ILM to automatically roll over data streams when the write
index reaches a specified age or size. If needed, you can also manually roll over a
data stream.
Generation
Each data stream tracks its generation: a six-digit, zero-padded integer starting
at 000001.
When a backing index is created, the index is named using the following
convention:
.ds-<data-stream>-<yyyy.MM.dd>-<generation>
<yyyy.MM.dd> is the backing index’s creation date. Backing indices with a higher
generation contain more recent data. For example, the web-server-logs data stream
has a generation of 34. The stream’s most recent backing index, created on 7 March
2099, is named .ds-web-server-logs-2099.03.07-000034.
Some operations, such as a shrink or restore, can change a backing index’s name.
These name changes do not remove a backing index from its data stream.
The generation of the data stream can change without a new index being added to
the data stream (e.g. when an existing backing index is shrunk). This means the
backing indices for some generations will never exist. You should not derive any
intelligence from the backing indices names.
Append-only (mostly)
Data streams are designed for use cases where existing data is rarely updated. You
cannot send update or deletion requests for existing documents directly to a data
stream. However, you can still update or delete documents in a data stream by
submitting requests directly to the document’s backing index.
If you need to update a larger number of documents in a data stream, you can use
the update by query and delete by query APIs.
If you frequently send multiple documents using the same _id expecting last-write-
wins, you may want to use an index alias with a write index instead. See Manage
time series data without data streams.
Dimensions
Dimensions are field names and values that, in combination, identify a document’s
time series. In most cases, a dimension describes some aspect of the entity you’re
measuring. For example, documents related to the same weather sensor may
always have the same sensor_id and location values.
A TSDS document is uniquely identified by its time series and timestamp, both of
which are used to generate the document _id. So, two documents with the same
dimensions and the same timestamp are considered to be duplicates. When you use
the _bulk endpoint to add documents to a TSDS, a second document with the same
timestamp and dimensions overwrites the first. When you use the PUT
/<target>/_create/<_id> format to add an individual document and a document
with the same _id already exists, an error is generated.
You mark a field as a dimension using the boolean time_series_dimension mapping
parameter. The following field types support the time_series_dimension parameter:
Metrics
Metrics are fields that contain numeric measurements, as well as aggregations
and/or downsampling values based off of those measurements. While not required,
documents in a TSDS typically contain one or more metric fields.
Metrics differ from dimensions in that while dimensions generally remain constant,
metrics are expected to change over time, even if rarely or slowly.
To mark a field as a metric, you must specify a metric type using
the time_series_metric mapping parameter. The following field types support
the time_series_metric parameter:
aggregate_metric_double
histogram
All numeric field types
Accepted metric types vary based on the field type:
Valid values for time_series_metric
counter
A cumulative metric that only monotonically increases or resets to 0 (zero). For
example, a count of errors or completed tasks.
A counter field has additional semantic meaning, because it represents a
cumulative counter. This works well with the rate aggregation, since a rate can be
derived from a cumulative monotonically increasing counter. However a number of
aggregations (for example sum) compute results that don’t make sense for a
counter field, because of its cumulative nature.
Only numeric and aggregate_metric_double fields support the counter metric type.
Due to the cumulative nature of counter fields, the following aggregations are
supported and expected to provide meaningful results with
the counter field: rate, histogram, range, min, max, top_metrics and variable_width_
histogram. In order to prevent issues with existing integrations and custom
dashboards, we also allow the following aggregations, even if the result might be
meaningless on counters: avg, box plot, cardinality, extended stats, median
absolute deviation, percentile ranks, percentiles, stats, sum and value count.
gauge
A metric that represents a single numeric that can arbitrarily increase or decrease.
For example, a temperature or available disk space.
Only numeric and aggregate_metric_double fields support the gauge metric type.
null (Default)
Not a time series metric.
Time series mode
The matching index template for a TSDS must contain a data_stream object with
the index_mode: time_series option. This option ensures the TSDS creates backing
indices with an index.mode setting of time_series. This setting enables most TSDS-
related functionality in the backing indices.
If you convert an existing data stream to a TSDS, only backing indices created after
the conversion have an index.mode of time_series. You can’t change
the index.mode of an existing backing index.
_tsid metadata field
When you add a document to a TSDS, Elasticsearch automatically generates
a _tsid metadata field for the document. The _tsid is an object containing the
document’s dimensions. Documents in the same TSDS with the same _tsid are part
of the same time series.
The _tsid field is not queryable or updatable. You also can’t retrieve a
document’s _tsid using a get document request. However, you can use
the _tsid field in aggregations and retrieve the _tsid value in searches using
the fields parameter.
The format of the _tsid field shouldn’t be relied upon. It may change from version to
version.
Time-bound indices
In a TSDS, each backing index, including the most recent backing index, has a range
of accepted @timestamp values. This range is defined by
the index.time_series.start_time and index.time_series.end_time index settings.
When you add a document to a TSDS, Elasticsearch adds the document to the
appropriate backing index based on its @timestamp value. As a result, a TSDS can
add documents to any TSDS backing index that can receive writes. This applies
even if the index isn’t the most recent backing index.
Some ILM actions mark the source index as read-only, or expect the index to not be
actively written anymore in order to provide good performance. These actions are:
- Delete - Downsample - Force merge - Read only - Searchable
snapshot - Shrink Index lifecycle management will not proceed with executing these
actions until the upper time-bound for accepting writes, represented by
the index.time_series.end_time index setting, has lapsed.
If no backing index can accept a document’s @timestamp value, Elasticsearch
rejects the document.
Elasticsearch automatically
configures index.time_series.start_time and index.time_series.end_time settings as
part of the index creation and rollover process.
Look-ahead time
Use the index.look_ahead_time index setting to configure how far into the future
you can add documents to an index. When you create a new write index for a TSDS,
Elasticsearch calculates the index’s index.time_series.end_time value as:
now + index.look_ahead_time
At the time series poll interval (controlled via time_series.poll_interval setting),
Elasticsearch checks if the write index has met the rollover criteria in its index
lifecycle policy. If not, Elasticsearch refreshes the now value and updates the write
index’s index.time_series.end_time to:
now + index.look_ahead_time + time_series.poll_interval
This process continues until the write index rolls over. When the index rolls over,
Elasticsearch sets a final index.time_series.end_time value for the index. This value
borders the index.time_series.start_time for the new write index. This ensures
the @timestamp ranges for neighboring backing indices always border but never
overlap.
Look-back time
Use the index.look_back_time index setting to configure how far in the past you can
add documents to an index. When you create a data stream for a TSDS,
Elasticsearch calculates the index’s index.time_series.start_time value as:
now - index.look_back_time
This setting is only used when a data stream gets created and controls
the index.time_series.start_time index setting of the first backing index. Configuring
this index setting can be useful to accept documents with @timestamp field values
that are older than 2 hours (the index.look_back_time default).
Accepted time range for adding data
A TSDS is designed to ingest current metrics data. When the TSDS is first created
the initial backing index has:
an index.time_series.start_time value set to now - index.look_ahead_time
an index.time_series.end_time value set to now + index.look_ahead_time
Only data that falls inside that range can be indexed.
You can use the get data stream API to check the accepted time range for writing to
any TSDS.
Dimension-based routing
Within each TSDS backing index, Elasticsearch uses the index.routing_path index
setting to route documents with the same dimensions to the same shards.
When you create the matching index template for a TSDS, you must specify one or
more dimensions in the index.routing_path setting. Each document in a TSDS must
contain one or more dimensions that match the index.routing_path setting.
Dimensions in the index.routing_path setting must be plain keyword fields.
The index.routing_path setting accepts wildcard patterns (for example dim.*) and
can dynamically match new fields. However, Elasticsearch will reject any mapping
updates that add scripted, runtime, or non-dimension, non-keyword fields that
match the index.routing_path value.
TSDS documents don’t support a custom _routing value. Similarly, you can’t require
a _routing value in mappings for a TSDS.
Index sorting
Elasticsearch uses compression algorithms to compress repeated values. This
compression works best when repeated values are stored near each other — in the
same index, on the same shard, and side-by-side in the same shard segment.
Most time series data contains repeated values. Dimensions are repeated across
documents in the same time series. The metric values of a time series may also
change slowly over time.
Internally, each TSDS backing index uses index sorting to order its shard segments
by _tsid and @timestamp. This makes it more likely that these repeated values are
stored near each other for better compression. A TSDS doesn’t support
any index.sort.* index settings.
What’s next?
Now that you know the basics, you’re ready to create a TSDS or convert an existing
data stream to a TSDS.