本地英文版地址: ../en/search-profile.html
Profile APIedit
The Profile API is a debugging tool and adds significant overhead to search execution.
Provides detailed timing information about the execution of individual components in a search request.
Descriptionedit
The Profile API gives the user insight into how search requests are executed at a low level so that the user can understand why certain requests are slow, and take steps to improve them. Note that the Profile API, amongst other things, doesn’t measure network latency, time spent in the search fetch phase, time spent while the requests spends in queues or while merging shard responses on the coordinating node.
The output from the Profile API is very verbose, especially for complicated requests executed across many shards. Pretty-printing the response is recommended to help understand the output.
Examplesedit
Any _search
request can be profiled by adding a top-level profile
parameter:
The API returns the following result:
{ "took": 25, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped" : 0, "failed": 0 }, "hits": { "total" : { "value": 4, "relation": "eq" }, "max_score": 0.5093388, "hits": [...] }, "profile": { "shards": [ { "id": "[2aE02wS1R8q_QFnYu6vDVQ][twitter][0]", "searches": [ { "query": [ { "type": "BooleanQuery", "description": "message:some message:number", "time_in_nanos": "1873811", "breakdown": { "score": 51306, "score_count": 4, "build_scorer": 2935582, "build_scorer_count": 1, "match": 0, "match_count": 0, "create_weight": 919297, "create_weight_count": 1, "next_doc": 53876, "next_doc_count": 5, "advance": 0, "advance_count": 0, "compute_max_score": 0, "compute_max_score_count": 0, "shallow_advance": 0, "shallow_advance_count": 0, "set_min_competitive_score": 0, "set_min_competitive_score_count": 0 }, "children": [ { "type": "TermQuery", "description": "message:some", "time_in_nanos": "391943", "breakdown": { "score": 28776, "score_count": 4, "build_scorer": 784451, "build_scorer_count": 1, "match": 0, "match_count": 0, "create_weight": 1669564, "create_weight_count": 1, "next_doc": 10111, "next_doc_count": 5, "advance": 0, "advance_count": 0, "compute_max_score": 0, "compute_max_score_count": 0, "shallow_advance": 0, "shallow_advance_count": 0, "set_min_competitive_score": 0, "set_min_competitive_score_count": 0 } }, { "type": "TermQuery", "description": "message:number", "time_in_nanos": "210682", "breakdown": { "score": 4552, "score_count": 4, "build_scorer": 42602, "build_scorer_count": 1, "match": 0, "match_count": 0, "create_weight": 89323, "create_weight_count": 1, "next_doc": 2852, "next_doc_count": 5, "advance": 0, "advance_count": 0, "compute_max_score": 0, "compute_max_score_count": 0, "shallow_advance": 0, "shallow_advance_count": 0, "set_min_competitive_score": 0, "set_min_competitive_score_count": 0 } } ] } ], "rewrite_time": 51443, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time_in_nanos": "32273" } ] } ], "aggregations": [] } ] } }
Even for a simple query, the response is relatively complicated. Let’s break it down piece-by-piece before moving to more complex examples.
The overall structure of the profile response is as follows:
{ "profile": { "shards": [ { "id": "[2aE02wS1R8q_QFnYu6vDVQ][twitter][0]", "searches": [ { "query": [...], "rewrite_time": 51443, "collector": [...] } ], "aggregations": [...] } ] } }
A profile is returned for each shard that participated in the response, and is identified by a unique ID. |
|
Each profile contains a section which holds details about the query execution. |
|
Each profile has a single time representing the cumulative rewrite time. |
|
Each profile also contains a section about the Lucene Collectors which run the search. |
|
Each profile contains a section which holds the details about the aggregation execution. |
Because a search request may be executed against one or more shards in an index,
and a search may cover one or more indices, the top level element in the profile
response is an array of shard
objects. Each shard object lists its id
which
uniquely identifies the shard. The ID’s format is
[nodeID][indexName][shardID]
.
The profile itself may consist of one or more "searches", where a search is a
query executed against the underlying Lucene index. Most search requests
submitted by the user will only execute a single search
against the Lucene
index. But occasionally multiple searches will be executed, such as including a
global aggregation (which needs to execute a secondary "match_all" query for the
global context).
Inside each search
object there will be two arrays of profiled information:
a query
array and a collector
array. Alongside the search
object is an
aggregations
object that contains the profile information for the
aggregations. In the future, more sections may be added, such as suggest
,
highlight
, etc.
There will also be a rewrite
metric showing the total time spent rewriting the
query (in nanoseconds).
As with other statistics apis, the Profile API supports human readable outputs. This can be turned on by adding
?human=true
to the query string. In this case, the output contains the additional time
field containing rounded,
human readable timing information (e.g. "time": "391,9ms"
, "time": "123.3micros"
).
Profiling Queriesedit
The details provided by the Profile API directly expose Lucene class names and concepts, which means that complete interpretation of the results require fairly advanced knowledge of Lucene. This page attempts to give a crash-course in how Lucene executes queries so that you can use the Profile API to successfully diagnose and debug queries, but it is only an overview. For complete understanding, please refer to Lucene’s documentation and, in places, the code.
With that said, a complete understanding is often not required to fix a slow query. It is usually
sufficient to see that a particular component of a query is slow, and not necessarily understand why
the advance
phase of that query is the cause, for example.
query
Sectionedit
The query
section contains detailed timing of the query tree executed by
Lucene on a particular shard. The overall structure of this query tree will
resemble your original Elasticsearch query, but may be slightly (or sometimes
very) different. It will also use similar but not always identical naming.
Using our previous match
query example, let’s analyze the query
section:
"query": [ { "type": "BooleanQuery", "description": "message:some message:number", "time_in_nanos": "1873811", "breakdown": {...}, "children": [ { "type": "TermQuery", "description": "message:some", "time_in_nanos": "391943", "breakdown": {...} }, { "type": "TermQuery", "description": "message:number", "time_in_nanos": "210682", "breakdown": {...} } ] } ]
Based on the profile structure, we can see that our match
query was rewritten
by Lucene into a BooleanQuery with two clauses (both holding a TermQuery). The
type
field displays the Lucene class name, and often aligns with the
equivalent name in Elasticsearch. The description
field displays the Lucene
explanation text for the query, and is made available to help differentiating
between parts of your query (e.g. both message:search
and message:test
are
TermQuery’s and would appear identical otherwise.
The time_in_nanos
field shows that this query took ~1.8ms for the entire
BooleanQuery to execute. The recorded time is inclusive of all children.
The breakdown
field will give detailed stats about how the time was spent,
we’ll look at that in a moment. Finally, the children
array lists any
sub-queries that may be present. Because we searched for two values ("search
test"), our BooleanQuery holds two children TermQueries. They have identical
information (type, time, breakdown, etc). Children are allowed to have their
own children.
Timing Breakdownedit
The breakdown
component lists detailed timing statistics about low-level
Lucene execution:
"breakdown": { "score": 51306, "score_count": 4, "build_scorer": 2935582, "build_scorer_count": 1, "match": 0, "match_count": 0, "create_weight": 919297, "create_weight_count": 1, "next_doc": 53876, "next_doc_count": 5, "advance": 0, "advance_count": 0, "compute_max_score": 0, "compute_max_score_count": 0, "shallow_advance": 0, "shallow_advance_count": 0, "set_min_competitive_score": 0, "set_min_competitive_score_count": 0 }
Timings are listed in wall-clock nanoseconds and are not normalized at all. All
caveats about the overall time_in_nanos
apply here. The intention of the
breakdown is to give you a feel for A) what machinery in Lucene is actually
eating time, and B) the magnitude of differences in times between the various
components. Like the overall time, the breakdown is inclusive of all children
times.
The meaning of the stats are as follows:
All parameters:edit
|
A Query in Lucene must be capable of reuse across multiple IndexSearchers (think of it as the engine that
executes a search against a specific Lucene Index). This puts Lucene in a tricky spot, since many queries
need to accumulate temporary state/statistics associated with the index it is being used against, but the
Query contract mandates that it must be immutable.
|
|
This parameter shows how long it takes to build a Scorer for the query. A Scorer is the mechanism that
iterates over matching documents and generates a score per-document (e.g. how well does "foo" match the document?).
Note, this records the time required to generate the Scorer object, not actually score the documents. Some
queries have faster or slower initialization of the Scorer, depending on optimizations, complexity, etc.
|
|
The Lucene method |
|
|
|
Some queries, such as phrase queries, match documents using a "two-phase" process. First, the document is
"approximately" matched, and if it matches approximately, it is checked a second time with a more rigorous
(and expensive) process. The second phase verification is what the |
|
This records the time taken to score a particular document via its Scorer |
|
Records the number of invocations of the particular method. For example, |
collectors
Sectionedit
The Collectors portion of the response shows high-level execution details. Lucene works by defining a "Collector" which is responsible for coordinating the traversal, scoring, and collection of matching documents. Collectors are also how a single query can record aggregation results, execute unscoped "global" queries, execute post-query filters, etc.
Looking at the previous example:
"collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time_in_nanos": "32273" } ]
We see a single collector named SimpleTopScoreDocCollector
wrapped into
CancellableCollector
. SimpleTopScoreDocCollector
is the default "scoring and
sorting" Collector
used by Elasticsearch. The reason
field attempts to give a plain
English description of the class name. The time_in_nanos
is similar to the
time in the Query tree: a wall-clock time inclusive of all children. Similarly,
children
lists all sub-collectors. The CancellableCollector
that wraps
SimpleTopScoreDocCollector
is used by Elasticsearch to detect if the current search was
cancelled and stop collecting documents as soon as it occurs.
It should be noted that Collector times are independent from the Query times. They are calculated, combined, and normalized independently! Due to the nature of Lucene’s execution, it is impossible to "merge" the times from the Collectors into the Query section, so they are displayed in separate portions.
For reference, the various collector reasons are:
|
A collector that scores and sorts documents. This is the most common collector and will be seen in most simple searches |
|
A collector that only counts the number of documents that match the query, but does not fetch the source.
This is seen when |
|
A collector that terminates search execution after |
|
A collector that only returns matching documents that have a score greater than |
|
A collector that wraps several other collectors. This is seen when combinations of search, aggregations, global aggs, and post_filters are combined in a single search. |
|
A collector that halts execution after a specified period of time. This is seen when a |
|
A collector that Elasticsearch uses to run aggregations against the query scope. A single |
|
A collector that executes an aggregation against the global query scope, rather than the specified query. Because the global scope is necessarily different from the executed query, it must execute its own match_all query (which you will see added to the Query section) to collect your entire dataset |
rewrite
Sectionedit
All queries in Lucene undergo a "rewriting" process. A query (and its sub-queries) may be rewritten one or more times, and the process continues until the query stops changing. This process allows Lucene to perform optimizations, such as removing redundant clauses, replacing one query for a more efficient execution path, etc. For example a Boolean → Boolean → TermQuery can be rewritten to a TermQuery, because all the Booleans are unnecessary in this case.
The rewriting process is complex and difficult to display, since queries can change drastically. Rather than showing the intermediate results, the total rewrite time is simply displayed as a value (in nanoseconds). This value is cumulative and contains the total time for all queries being rewritten.
A more complex exampleedit
To demonstrate a slightly more complex query and the associated results, we can profile the following query:
GET /twitter/_search { "profile": true, "query": { "term": { "user": { "value": "test" } } }, "aggs": { "my_scoped_agg": { "terms": { "field": "likes" } }, "my_global_agg": { "global": {}, "aggs": { "my_level_agg": { "terms": { "field": "likes" } } } } }, "post_filter": { "match": { "message": "some" } } }
This example has:
- A query
- A scoped aggregation
- A global aggregation
- A post_filter
The API returns the following result:
{ ... "profile": { "shards": [ { "id": "[P6-vulHtQRWuD4YnubWb7A][test][0]", "searches": [ { "query": [ { "type": "TermQuery", "description": "message:some", "time_in_nanos": "409456", "breakdown": { "score": 0, "build_scorer_count": 1, "match_count": 0, "create_weight": 31584, "next_doc": 0, "match": 0, "create_weight_count": 1, "next_doc_count": 2, "score_count": 1, "build_scorer": 377872, "advance": 0, "advance_count": 0, "compute_max_score": 0, "compute_max_score_count": 0, "shallow_advance": 0, "shallow_advance_count": 0, "set_min_competitive_score": 0, "set_min_competitive_score_count": 0 } }, { "type": "TermQuery", "description": "user:test", "time_in_nanos": "303702", "breakdown": { "score": 0, "build_scorer_count": 1, "match_count": 0, "create_weight": 185215, "next_doc": 5936, "match": 0, "create_weight_count": 1, "next_doc_count": 2, "score_count": 1, "build_scorer": 112551, "advance": 0, "advance_count": 0, "compute_max_score": 0, "compute_max_score_count": 0, "shallow_advance": 0, "shallow_advance_count": 0, "set_min_competitive_score": 0, "set_min_competitive_score_count": 0 } } ], "rewrite_time": 7208, "collector": [ { "name": "MultiCollector", "reason": "search_multi", "time_in_nanos": 1820, "children": [ { "name": "FilteredCollector", "reason": "search_post_filter", "time_in_nanos": 7735, "children": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time_in_nanos": 1328 } ] }, { "name": "MultiBucketCollector: [[my_scoped_agg, my_global_agg]]", "reason": "aggregation", "time_in_nanos": 8273 } ] } ] } ], "aggregations": [...] } ] } }
As you can see, the output is significantly more verbose than before. All the major portions of the query are represented:
-
The first
TermQuery
(user:test) represents the mainterm
query. -
The second
TermQuery
(message:some) represents thepost_filter
query.
The Collector tree is fairly straightforward, showing how a single CancellableCollector wraps a MultiCollector which also wraps a FilteredCollector to execute the post_filter (and in turn wraps the normal scoring SimpleCollector), a BucketCollector to run all scoped aggregations.
Understanding MultiTermQuery outputedit
A special note needs to be made about the MultiTermQuery
class of queries.
This includes wildcards, regex, and fuzzy queries. These queries emit very
verbose responses, and are not overly structured.
Essentially, these queries rewrite themselves on a per-segment basis. If you
imagine the wildcard query b*
, it technically can match any token that begins
with the letter "b". It would be impossible to enumerate all possible
combinations, so Lucene rewrites the query in context of the segment being
evaluated, e.g., one segment may contain the tokens [bar, baz]
, so the query
rewrites to a BooleanQuery combination of "bar" and "baz". Another segment may
only have the token [bakery]
, so the query rewrites to a single TermQuery for
"bakery".
Due to this dynamic, per-segment rewriting, the clean tree structure becomes distorted and no longer follows a clean "lineage" showing how one query rewrites into the next. At present time, all we can do is apologize, and suggest you collapse the details for that query’s children if it is too confusing. Luckily, all the timing statistics are correct, just not the physical layout in the response, so it is sufficient to just analyze the top-level MultiTermQuery and ignore its children if you find the details too tricky to interpret.
Hopefully this will be fixed in future iterations, but it is a tricky problem to solve and still in-progress. :)
Profiling Aggregationsedit
aggregations
Sectionedit
The aggregations
section contains detailed timing of the aggregation tree
executed by a particular shard. The overall structure of this aggregation tree
will resemble your original Elasticsearch request. Let’s execute the previous query again
and look at the aggregation profile this time:
GET /twitter/_search { "profile": true, "query": { "term": { "user": { "value": "test" } } }, "aggs": { "my_scoped_agg": { "terms": { "field": "likes" } }, "my_global_agg": { "global": {}, "aggs": { "my_level_agg": { "terms": { "field": "likes" } } } } }, "post_filter": { "match": { "message": "some" } } }
This yields the following aggregation profile output:
{ "profile" : { "shards" : [ { "aggregations" : [ { "type" : "LongTermsAggregator", "description" : "my_scoped_agg", "time_in_nanos" : 195386, "breakdown" : { "reduce" : 0, "build_aggregation" : 81171, "build_aggregation_count" : 1, "initialize" : 22753, "initialize_count" : 1, "reduce_count" : 0, "collect" : 91456, "collect_count" : 4 } }, { "type" : "GlobalAggregator", "description" : "my_global_agg", "time_in_nanos" : 190430, "breakdown" : { "reduce" : 0, "build_aggregation" : 59990, "build_aggregation_count" : 1, "initialize" : 29619, "initialize_count" : 1, "reduce_count" : 0, "collect" : 100815, "collect_count" : 4 }, "children" : [ { "type" : "LongTermsAggregator", "description" : "my_level_agg", "time_in_nanos" : 160329, "breakdown" : { "reduce" : 0, "build_aggregation" : 55712, "build_aggregation_count" : 1, "initialize" : 10559, "initialize_count" : 1, "reduce_count" : 0, "collect" : 94052, "collect_count" : 4 } } ] } ] } ] } }
From the profile structure we can see that the my_scoped_agg
is internally
being run as a LongTermsAggregator
(because the field it is aggregating,
likes
, is a numeric field). At the same level, we see a GlobalAggregator
which comes from my_global_agg
. That aggregation then has a child
LongTermsAggregator
which comes from the second term’s aggregation on likes
.
The time_in_nanos
field shows the time executed by each aggregation, and is
inclusive of all children. While the overall time is useful, the breakdown
field will give detailed stats about how the time was spent.
Timing Breakdownedit
The breakdown
component lists detailed timing statistics about low-level
Lucene execution:
"breakdown": { "reduce": 0, "reduce_count": 0, "build_aggregation": 49765, "build_aggregation_count": 300, "initialize": 52785, "initialize_count": 300, "reduce_count": 0, "collect": 3155490036, "collect_count": 1800 }
Timings are listed in wall-clock nanoseconds and are not normalized at all. All
caveats about the overall time
apply here. The intention of the breakdown is
to give you a feel for A) what machinery in Elasticsearch is actually eating time, and B)
the magnitude of differences in times between the various components. Like the
overall time, the breakdown is inclusive of all children times.
The meaning of the stats are as follows:
All parameters:edit
|
This times how long it takes to create and initialise the aggregation before starting to collect documents. |
|
This represents the cumulative time spent in the collect phase of the aggregation. This is where matching documents are passed to the aggregation and the state of the aggregator is updated based on the information contained in the documents. |
|
This represents the time spent creating the shard level results of the aggregation ready to pass back to the reducing node after the collection of documents is finished. |
|
This is not currently used and will always report |
|
Records the number of invocations of the particular method. For example, |
Profiling Considerationsedit
Like any profiler, the Profile API introduces a non-negligible overhead to
search execution. The act of instrumenting low-level method calls such as
collect
, advance
, and next_doc
can be fairly expensive, since these
methods are called in tight loops. Therefore, profiling should not be enabled
in production settings by default, and should not be compared against
non-profiled query times. Profiling is just a diagnostic tool.
There are also cases where special Lucene optimizations are disabled, since they are not amenable to profiling. This could cause some queries to report larger relative times than their non-profiled counterparts, but in general should not have a drastic effect compared to other components in the profiled query.
Limitationsedit
- Profiling currently does not measure the search fetch phase nor the network overhead.
- Profiling also does not account for time spent in the queue, merging shard responses on the coordinating node, or additional work such as building global ordinals (an internal data structure used to speed up search).
-
Profiling statistics are currently not available for suggestions,
highlighting,
dfs_query_then_fetch
. - Profiling of the reduce phase of aggregation is currently not available.
- The Profiler is still highly experimental. The Profiler is instrumenting parts of Lucene that were never designed to be exposed in this manner, and so all results should be viewed as a best effort to provide detailed diagnostics. We hope to improve this over time. If you find obviously wrong numbers, strange query structures, or other bugs, please report them!
- Elasticsearch权威指南: 其他版本:
- Elasticsearch是什么?
- 7.7版本的新特性
- 开始使用Elasticsearch
- 安装和设置
- 升级Elasticsearch
- 搜索你的数据
- 查询领域特定语言(Query DSL)
- SQL access(暂时不翻译)
- Overview
- Getting Started with SQL
- Conventions and Terminology
- Security
- SQL REST API
- SQL Translate API
- SQL CLI
- SQL JDBC
- SQL ODBC
- SQL Client Applications
- SQL Language
- Functions and Operators
- Comparison Operators
- Logical Operators
- Math Operators
- Cast Operators
- LIKE and RLIKE Operators
- Aggregate Functions
- Grouping Functions
- Date/Time and Interval Functions and Operators
- Full-Text Search Functions
- Mathematical Functions
- String Functions
- Type Conversion Functions
- Geo Functions
- Conditional Functions And Expressions
- System Functions
- Reserved keywords
- SQL Limitations
- 聚合
- 度量(metric)聚合
- 桶(bucket)聚合
- adjacency_matrix 聚合
- auto_date_histogram 聚合
- children 聚合
- composite 聚合
- date_histogram 聚合
- date_range 聚合
- diversified_sampler 聚合
- filter 聚合
- filters 聚合
- geo_distance 聚合
- geohash_grid 聚合
- geotile_grid 聚合
- global 聚合
- histogram 聚合
- ip_range 聚合
- missing 聚合
- nested 聚合
- parent 聚合
- range 聚合
- rare_terms 聚合
- reverse_nested 聚合
- sampler 聚合
- significant_terms 聚合
- significant_text 聚合
- terms 聚合
- 给范围字段分桶的微妙之处
- 管道(pipeline)聚合
- 矩阵(matrix)聚合
- 重度缓存的聚合
- 只返回聚合的结果
- 聚合元数据
- Returning the type of the aggregation
- 使用转换对聚合结果进行索引
- 脚本
- 映射
- 删除的映射类型
- 字段数据类型
- alias(别名)
- array(数组)
- binary(二进制)
- boolean(布尔)
- date(日期)
- date_nanos(日期纳秒)
- dense_vector(密集矢量)
- histogram(直方图)
- flattened(扁平)
- geo_point(地理坐标点)
- geo_shape(地理形状)
- IP
- join(联结)
- keyword(关键词)
- nested(嵌套)
- numeric(数值)
- object(对象)
- percolator(渗透器)
- range(范围)
- rank_feature(特征排名)
- rank_features(特征排名)
- search_as_you_type(输入即搜索)
- Sparse vector
- Text
- Token count
- Shape
- Constant keyword
- Meta-Fields
- Mapping parameters
- Dynamic Mapping
- Text analysis
- Overview
- Concepts
- Configure text analysis
- Built-in analyzer reference
- Tokenizer reference
- Char Group Tokenizer
- Classic Tokenizer
- Edge n-gram tokenizer
- Keyword Tokenizer
- Letter Tokenizer
- Lowercase Tokenizer
- N-gram tokenizer
- Path Hierarchy Tokenizer
- Path Hierarchy Tokenizer Examples
- Pattern Tokenizer
- Simple Pattern Tokenizer
- Simple Pattern Split Tokenizer
- Standard Tokenizer
- Thai Tokenizer
- UAX URL Email Tokenizer
- Whitespace Tokenizer
- Token filter reference
- Apostrophe
- ASCII folding
- CJK bigram
- CJK width
- Classic
- Common grams
- Conditional
- Decimal digit
- Delimited payload
- Dictionary decompounder
- Edge n-gram
- Elision
- Fingerprint
- Flatten graph
- Hunspell
- Hyphenation decompounder
- Keep types
- Keep words
- Keyword marker
- Keyword repeat
- KStem
- Length
- Limit token count
- Lowercase
- MinHash
- Multiplexer
- N-gram
- Normalization
- Pattern capture
- Pattern replace
- Phonetic
- Porter stem
- Predicate script
- Remove duplicates
- Reverse
- Shingle
- Snowball
- Stemmer
- Stemmer override
- Stop
- Synonym
- Synonym graph
- Trim
- Truncate
- Unique
- Uppercase
- Word delimiter
- Word delimiter graph
- Character filters reference
- Normalizers
- Index modules
- Ingest node
- Pipeline Definition
- Accessing Data in Pipelines
- Conditional Execution in Pipelines
- Handling Failures in Pipelines
- Enrich your data
- Processors
- Append Processor
- Bytes Processor
- Circle Processor
- Convert Processor
- CSV Processor
- Date Processor
- Date Index Name Processor
- Dissect Processor
- Dot Expander Processor
- Drop Processor
- Enrich Processor
- Fail Processor
- Foreach Processor
- GeoIP Processor
- Grok Processor
- Gsub Processor
- HTML Strip Processor
- Inference Processor
- Join Processor
- JSON Processor
- KV Processor
- Lowercase Processor
- Pipeline Processor
- Remove Processor
- Rename Processor
- Script Processor
- Set Processor
- Set Security User Processor
- Split Processor
- Sort Processor
- Trim Processor
- Uppercase Processor
- URL Decode Processor
- User Agent processor
- ILM: Manage the index lifecycle
- Monitor a cluster
- Frozen indices
- Roll up or transform your data
- Set up a cluster for high availability
- Snapshot and restore
- Secure a cluster
- Overview
- Configuring security
- User authentication
- Built-in users
- Internal users
- Token-based authentication services
- Realms
- Realm chains
- Active Directory user authentication
- File-based user authentication
- LDAP user authentication
- Native user authentication
- OpenID Connect authentication
- PKI user authentication
- SAML authentication
- Kerberos authentication
- Integrating with other authentication systems
- Enabling anonymous access
- Controlling the user cache
- Configuring SAML single-sign-on on the Elastic Stack
- Configuring single sign-on to the Elastic Stack using OpenID Connect
- User authorization
- Built-in roles
- Defining roles
- Security privileges
- Document level security
- Field level security
- Granting privileges for indices and aliases
- Mapping users and groups to roles
- Setting up field and document level security
- Submitting requests on behalf of other users
- Configuring authorization delegation
- Customizing roles and authorization
- Enabling audit logging
- Encrypting communications
- Restricting connections with IP filtering
- Cross cluster search, clients, and integrations
- Tutorial: Getting started with security
- Tutorial: Encrypting communications
- Troubleshooting
- Some settings are not returned via the nodes settings API
- Authorization exceptions
- Users command fails due to extra arguments
- Users are frequently locked out of Active Directory
- Certificate verification fails for curl on Mac
- SSLHandshakeException causes connections to fail
- Common SSL/TLS exceptions
- Common Kerberos exceptions
- Common SAML issues
- Internal Server Error in Kibana
- Setup-passwords command fails due to connection failure
- Failures due to relocation of the configuration files
- Limitations
- Alerting on cluster and index events
- Command line tools
- How To
- Glossary of terms
- REST APIs
- API conventions
- cat APIs
- cat aliases
- cat allocation
- cat anomaly detectors
- cat count
- cat data frame analytics
- cat datafeeds
- cat fielddata
- cat health
- cat indices
- cat master
- cat nodeattrs
- cat nodes
- cat pending tasks
- cat plugins
- cat recovery
- cat repositories
- cat shards
- cat segments
- cat snapshots
- cat task management
- cat templates
- cat thread pool
- cat trained model
- cat transforms
- Cluster APIs
- Cluster allocation explain
- Cluster get settings
- Cluster health
- Cluster reroute
- Cluster state
- Cluster stats
- Cluster update settings
- Nodes feature usage
- Nodes hot threads
- Nodes info
- Nodes reload secure settings
- Nodes stats
- Pending cluster tasks
- Remote cluster info
- Task management
- Voting configuration exclusions
- Cross-cluster replication APIs
- Document APIs
- Enrich APIs
- Explore API
- Index APIs
- Add index alias
- Analyze
- Clear cache
- Clone index
- Close index
- Create index
- Delete index
- Delete index alias
- Delete index template
- Flush
- Force merge
- Freeze index
- Get field mapping
- Get index
- Get index alias
- Get index settings
- Get index template
- Get mapping
- Index alias exists
- Index exists
- Index recovery
- Index segments
- Index shard stores
- Index stats
- Index template exists
- Open index
- Put index template
- Put mapping
- Refresh
- Rollover index
- Shrink index
- Split index
- Synced flush
- Type exists
- Unfreeze index
- Update index alias
- Update index settings
- Index lifecycle management API
- Ingest APIs
- Info API
- Licensing APIs
- Machine learning anomaly detection APIs
- Add events to calendar
- Add jobs to calendar
- Close jobs
- Create jobs
- Create calendar
- Create datafeeds
- Create filter
- Delete calendar
- Delete datafeeds
- Delete events from calendar
- Delete filter
- Delete forecast
- Delete jobs
- Delete jobs from calendar
- Delete model snapshots
- Delete expired data
- Estimate model memory
- Find file structure
- Flush jobs
- Forecast jobs
- Get buckets
- Get calendars
- Get categories
- Get datafeeds
- Get datafeed statistics
- Get influencers
- Get jobs
- Get job statistics
- Get machine learning info
- Get model snapshots
- Get overall buckets
- Get scheduled events
- Get filters
- Get records
- Open jobs
- Post data to jobs
- Preview datafeeds
- Revert model snapshots
- Set upgrade mode
- Start datafeeds
- Stop datafeeds
- Update datafeeds
- Update filter
- Update jobs
- Update model snapshots
- Machine learning data frame analytics APIs
- Create data frame analytics jobs
- Create inference trained model
- Delete data frame analytics jobs
- Delete inference trained model
- Evaluate data frame analytics
- Explain data frame analytics API
- Get data frame analytics jobs
- Get data frame analytics jobs stats
- Get inference trained model
- Get inference trained model stats
- Start data frame analytics jobs
- Stop data frame analytics jobs
- Migration APIs
- Reload search analyzers
- Rollup APIs
- Search APIs
- Security APIs
- Authenticate
- Change passwords
- Clear cache
- Clear roles cache
- Create API keys
- Create or update application privileges
- Create or update role mappings
- Create or update roles
- Create or update users
- Delegate PKI authentication
- Delete application privileges
- Delete role mappings
- Delete roles
- Delete users
- Disable users
- Enable users
- Get API key information
- Get application privileges
- Get builtin privileges
- Get role mappings
- Get roles
- Get token
- Get users
- Has privileges
- Invalidate API key
- Invalidate token
- OpenID Connect Prepare Authentication API
- OpenID Connect authenticate API
- OpenID Connect logout API
- SAML prepare authentication API
- SAML authenticate API
- SAML logout API
- SAML invalidate API
- SSL certificate
- Snapshot and restore APIs
- Snapshot lifecycle management API
- Transform APIs
- Usage API
- Watcher APIs
- Definitions
- Breaking changes
- Release notes
- Elasticsearch version 7.7.1
- Elasticsearch version 7.7.0
- Elasticsearch version 7.6.2
- Elasticsearch version 7.6.1
- Elasticsearch version 7.6.0
- Elasticsearch version 7.5.2
- Elasticsearch version 7.5.1
- Elasticsearch version 7.5.0
- Elasticsearch version 7.4.2
- Elasticsearch version 7.4.1
- Elasticsearch version 7.4.0
- Elasticsearch version 7.3.2
- Elasticsearch version 7.3.1
- Elasticsearch version 7.3.0
- Elasticsearch version 7.2.1
- Elasticsearch version 7.2.0
- Elasticsearch version 7.1.1
- Elasticsearch version 7.1.0
- Elasticsearch version 7.0.0
- Elasticsearch version 7.0.0-rc2
- Elasticsearch version 7.0.0-rc1
- Elasticsearch version 7.0.0-beta1
- Elasticsearch version 7.0.0-alpha2
- Elasticsearch version 7.0.0-alpha1