From ee4c5dede3721170fa06240e71b8c94a6b07d9dd Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Mon, 30 Oct 2023 12:02:46 +0100 Subject: [PATCH 1/9] Page structure --- docs/reference/esql/esql-get-started.asciidoc | 67 +++++++++++++++++-- .../esql/esql-getting-started-widget.asciidoc | 39 +++++++++++ .../esql/esql-getting-started.asciidoc | 12 ++++ 3 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 docs/reference/tab-widgets/esql/esql-getting-started-widget.asciidoc create mode 100644 docs/reference/tab-widgets/esql/esql-getting-started.asciidoc diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index 676ad0ca0bf10..31a40fe630ce5 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -5,20 +5,51 @@ Getting started ++++ -A simple example of an {esql} query is shown below: -[source,esql] +This guide shows you can use {esql} to query and aggregate your data. + +[discrete] +[[esql-getting-started-prerequisites]] +=== Prerequisites + +To follow along with the queries in this getting started guide, first ingest the +following sample data: + +[source,console] ---- -FROM employees -| EVAL age = DATE_DIFF(NOW(), birth_date, 'Y') -| STATS AVG(age) BY department -| SORT age DESC +PUT sample_data/_bulk +{"index": {}} +{"@timestamp": "2023-10-23T12:15:03.360Z", "client.ip": "172.21.2.162", "message": "Connected to 10.1.0.3", "event.duration": 3450233} +{"index": {}} +{"@timestamp": "2023-10-23T13:33:34.937Z", "client.ip": "172.21.0.5", "message": "Disconnected", "event.duration": 1232382} +{"index": {}} +{"@timestamp": "2023-10-23T13:51:54.732Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153} +{"index": {}} +{"@timestamp": "2023-10-23T13:52:55.015Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153} +{"index": {}} +{"@timestamp": "2023-10-23T13:53:55.832Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153} ---- +[discrete] +[[esql-getting-started-running-queries]] +==== Run an {esql} query + +In {kib}, you can use Console or Discover to run {esql} queries: + +include::{es-repo-dir}/tab-widgets/esql/esql-getting-started-widget.asciidoc[] + +[discrete] +[[esql-getting-started-first-query]] +==== Your first {esql} query + Each {esql} query starts with a <>. A source command produces a table, typically with data from {es}. image::images/esql/source-command.svg[A source command producing a table from {es},align="center"] +[discrete] +[[esql-getting-started-where]] +==== Multiple processing commands + A source command can be followed by one or more <>. Processing commands change an input table by adding, removing, or changing rows and columns. @@ -26,9 +57,33 @@ Processing commands can perform filtering, projection, aggregation, and more. image::images/esql/processing-command.svg[A processing command changing an input table,align="center"] +[discrete] +[[esql-getting-started-limit]] +==== Additional processing commands + You can chain processing commands, separated by a pipe character: `|`. Each processing command works on the output table of the previous command. image::images/esql/chaining-processing-commands.svg[Processing commands can be chained,align="center"] The result of a query is the table produced by the final processing command. + +[discrete] +[[esql-getting-started-stats]] +==== Calculate statistics + +[discrete] +[[esql-getting-started-histogram]] +==== Create a date histogram + + + +[discrete] +[[esql-getting-started-process-data]] +==== Process data + + + +[discrete] +[[esql-getting-started-enrich]] +==== Enrich data diff --git a/docs/reference/tab-widgets/esql/esql-getting-started-widget.asciidoc b/docs/reference/tab-widgets/esql/esql-getting-started-widget.asciidoc new file mode 100644 index 0000000000000..49dc573f3b0bb --- /dev/null +++ b/docs/reference/tab-widgets/esql/esql-getting-started-widget.asciidoc @@ -0,0 +1,39 @@ +++++ +
+
+ + +
+
+++++ + +include::esql-getting-started.asciidoc[tag=console] + +++++ +
+ +
+++++ \ No newline at end of file diff --git a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc new file mode 100644 index 0000000000000..ffc80571b8814 --- /dev/null +++ b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc @@ -0,0 +1,12 @@ +// tag::console[] + +Console + +// end::console[] + + +// tag::discover[] + +Discover + +// end::discover[] From 6843b702cf3f2c3f12ac3bec4ea0b6e766b558b6 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Tue, 31 Oct 2023 18:12:35 +0100 Subject: [PATCH 2/9] More getting started content --- docs/reference/esql/esql-commands.asciidoc | 2 + docs/reference/esql/esql-get-started.asciidoc | 381 ++++++++++++++++-- docs/reference/esql/esql-kibana.asciidoc | 4 + ...ql-process-data-with-dissect-grok.asciidoc | 2 +- docs/reference/images/esql/esql-keep.png | Bin 0 -> 18686 bytes docs/reference/images/esql/esql-limit.png | Bin 0 -> 18286 bytes .../reference/images/esql/esql-sort-limit.png | Bin 0 -> 29130 bytes docs/reference/images/esql/esql-sort.png | Bin 0 -> 18686 bytes .../esql/esql-getting-started.asciidoc | 36 +- 9 files changed, 397 insertions(+), 28 deletions(-) create mode 100644 docs/reference/images/esql/esql-keep.png create mode 100644 docs/reference/images/esql/esql-limit.png create mode 100644 docs/reference/images/esql/esql-sort-limit.png create mode 100644 docs/reference/images/esql/esql-sort.png diff --git a/docs/reference/esql/esql-commands.asciidoc b/docs/reference/esql/esql-commands.asciidoc index 8b0e99344add1..708127718fe38 100644 --- a/docs/reference/esql/esql-commands.asciidoc +++ b/docs/reference/esql/esql-commands.asciidoc @@ -5,6 +5,7 @@ Commands ++++ +[[esql-source-commands]] // tag::source_commands[] ==== Source commands @@ -20,6 +21,7 @@ image::images/esql/source-command.svg[A source command producing a table from {e // end::source_command[] +[[esql-processing-commands]] // tag::proc_commands[] ==== Processing commands diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index 31a40fe630ce5..717dadb746f65 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -1,5 +1,5 @@ [[esql-getting-started]] -== Getting started with {esql} +== Getting started with {esql} queries ++++ Getting started @@ -11,27 +11,45 @@ This guide shows you can use {esql} to query and aggregate your data. [[esql-getting-started-prerequisites]] === Prerequisites -To follow along with the queries in this getting started guide, first ingest the -following sample data: +To follow along with the queries in this getting started guide, first ingest +some sample data using the following requests: [source,console] ---- +PUT sample_data +{ + "mappings": { + "properties": { + "client.ip": { + "type": "ip" + }, + "message": { + "type": "keyword" + } + } + } +} + PUT sample_data/_bulk {"index": {}} {"@timestamp": "2023-10-23T12:15:03.360Z", "client.ip": "172.21.2.162", "message": "Connected to 10.1.0.3", "event.duration": 3450233} {"index": {}} +{"@timestamp": "2023-10-23T12:27:28.948Z", "client.ip": "172.21.2.113", "message": "Connected to 10.1.0.2", "event.duration": 2764889} +{"index": {}} {"@timestamp": "2023-10-23T13:33:34.937Z", "client.ip": "172.21.0.5", "message": "Disconnected", "event.duration": 1232382} {"index": {}} -{"@timestamp": "2023-10-23T13:51:54.732Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153} +{"@timestamp": "2023-10-23T13:51:54.732Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 725448} {"index": {}} {"@timestamp": "2023-10-23T13:52:55.015Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153} {"index": {}} -{"@timestamp": "2023-10-23T13:53:55.832Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153} +{"@timestamp": "2023-10-23T13:53:55.832Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 5033755} +{"index": {}} +{"@timestamp": "2023-10-23T13:55:01.543Z", "client.ip": "172.21.3.15", "message": "Connected to 10.1.0.1", "event.duration": 1756467} ---- [discrete] [[esql-getting-started-running-queries]] -==== Run an {esql} query +=== Run an {esql} query In {kib}, you can use Console or Discover to run {esql} queries: @@ -39,51 +57,364 @@ include::{es-repo-dir}/tab-widgets/esql/esql-getting-started-widget.asciidoc[] [discrete] [[esql-getting-started-first-query]] -==== Your first {esql} query +=== Your first {esql} query -Each {esql} query starts with a <>. A source command produces -a table, typically with data from {es}. +Each {esql} query starts with a <>. A +source command produces a table, typically with data from {es}. image::images/esql/source-command.svg[A source command producing a table from {es},align="center"] +The <> source command returns a table with documents from a data +stream, index, or alias. Each row in the resulting table represents a document. + +[source,esql] +---- +FROM sample_data +---- + +Each column corresponds to a field, and can be accessed by the name of that +field. + +[TIP] +==== +{esql} keywords are case-insensitive. The following query is identical to the +previous one: + +[source,esql] +---- +from sample_data +---- +==== + [discrete] -[[esql-getting-started-where]] -==== Multiple processing commands +[[esql-getting-started-limit]] +=== Processing commands A source command can be followed by one or more -<>. Processing commands change an -input table by adding, removing, or changing rows and columns. -Processing commands can perform filtering, projection, aggregation, and more. +<>, separated by a pipe character: +`|`. Processing commands change an input table by adding, removing, or changing +rows and columns. Processing commands can perform filtering, projection, +aggregation, and more. + +image::images/esql/esql-limit.png[A processing command changing an input table,align="center",width="60%"] -image::images/esql/processing-command.svg[A processing command changing an input table,align="center"] +For example, you can use the <> command to limit the number of rows +that are returned, to a maximum of 10,000 rows: + +[source,esql] +---- +FROM sample_data +| LIMIT 3 +---- + +[TIP] +==== +For readability, you can put each command on a separate line. However, you don't +have to. The following query is identical to the previous one: + +[source,esql] +---- +FROM sample_data | LIMIT 3 +---- +==== [discrete] -[[esql-getting-started-limit]] -==== Additional processing commands +[[esql-getting-started-sort]] +==== Sort a table + +image::images/esql/esql-sort.png[A processing command sorting an input table,align="center",width="60%"] + +Another processing command is the <> command. By default, the rows +returned by `FROM` don't have a defined sort order. Use the `SORT` command to +sort rows on one or more columns: + +[source,esql] +---- +FROM sample_data +| SORT @timestamp DESC +---- + +[discrete] +[[esql-getting-started-where]] +==== Query the data + +Use the <> command to query the data. For example, to find all +events with a duration longer than 5ms: + +[source,esql] +---- +FROM sample_data +| WHERE event.duration > 5000000 +---- + +`WHERE` supports several <>. For example, you can use <> to run a wildcard query against the `message` column: + +[source,esql] +---- +FROM sample_data +| WHERE message LIKE "Connected*" +---- + +[discrete] +[[esql-getting-started-more-commands]] +==== More processing commands + +There are many other processing commands, like <> and <> +to keep or drop columns, <> to enrich a table with data from +indices in {es}, and <> and <> to process data. Refer +to <> for an overview of all processing commands. + +[discrete] +[[esql-getting-started-chaining]] +=== Chain processing commands You can chain processing commands, separated by a pipe character: `|`. Each -processing command works on the output table of the previous command. +processing command works on the output table of the previous command. The result +of a query is the table produced by the final processing command. + +image::images/esql/esql-sort-limit.png[Processing commands can be chained,align="center"] -image::images/esql/chaining-processing-commands.svg[Processing commands can be chained,align="center"] +The following example first sorts the rows on `@timestamp`, and next limits the +result set to 3 rows: -The result of a query is the table produced by the final processing command. +[source,esql] +---- +FROM sample_data +| SORT @timestamp DESC +| LIMIT 3 +---- + +NOTE: The order of processing commands is important. First limiting the result +set to 3 rows before sorting those 3 rows could result in 3 different rows being +returned. + +[discrete] +[[esql-getting-started-eval]] +=== Compute values + +Use the <> command to append rows to a table, with calculated values. +For example, the following query appends a `duration_ms` column. The values in +the column are computed by dividing `event.duration` by 1,000,000. In other +words: `event.duration` converted from nanoseconds to milliseconds. + +[source,esql] +---- +FROM sample_data +| EVAL duration_ms = event.duration / 1000000.0 +---- + +`EVAL` supports several <>. For example, to round a +number to the closest number with the specified number of digits, use the +<> function: + +[source,esql] +---- +FROM sample_data +| EVAL duration_ms = ROUND(event.duration / 1000000.0, 1) +---- [discrete] [[esql-getting-started-stats]] -==== Calculate statistics +=== Calculate statistics + +{esql} can not only be used to query your data, you can also use it to aggregate +your data. Use the <> command to calculate statistics. For +example, the median duration: + +[source,esql] +---- +FROM sample_data +| STATS median_duration = MEDIAN(event.duration) +---- + +You can calculate multiple stats with one command: + +[source,esql] +---- +FROM sample_data +| STATS median_duration = MEDIAN(event.duration), max_duration = MAX(event.duration) +---- + +Use `BY` to group calculated stats by one or more other values. For example, to +calculate the median duration per client IP: + +[source,esql] +---- +FROM sample_data +| STATS median_duration = MEDIAN(event.duration) BY client.ip +---- [discrete] [[esql-getting-started-histogram]] -==== Create a date histogram +=== Create a histogram + +To track statistics over time, {esql} enables you to create histograms using the +<> function. `AUTO_BUCKET` creates human-friendly buckets and +returns a value for each row that corresponds to the resulting bucket the row +falls into. + +For example, to create hourly buckets for the data on October 23rd: + +[source,esql] +---- +FROM sample_data +| KEEP @timestamp +| EVAL bucket = AUTO_BUCKET (@timestamp, 24, "2023-10-23T00:00:00Z", "2023-10-23T23:59:59Z") +---- +Combine `AUTO_BUCKET` with <> to create a histogram. For example, +to count the number of events per hour: +[source,esql] +---- +FROM sample_data +| KEEP @timestamp, event.duration +| EVAL bucket = AUTO_BUCKET (@timestamp, 24, "2023-10-23T00:00:00Z", "2023-10-23T23:59:59Z") +| STATS COUNT(*) BY bucket +---- + +Or the median duration per hour: + +[source,esql] +---- +FROM sample_data +| KEEP @timestamp, event.duration +| EVAL bucket = AUTO_BUCKET (@timestamp, 24, "2023-10-23T00:00:00Z", "2023-10-23T23:59:59Z") +| STATS median_duration = MEDIAN(event.duration) BY bucket +---- + +[discrete] +[[esql-getting-started-enrich]] +=== Enrich data + +{esql} enables you to <> a table with data from indices +in {es}, using the <> command. + +image::images/esql/esql-enrich.png[align="center"] + +Before you can use `ENRICH`, you first need to +<> and <> +an <>. The following requests create a policy +that links an IP address to an environment ("Development", "QA", or +"Production"): + +[source,console] +---- +PUT clientips +{ + "mappings": { + "properties": { + "client.ip": { + "type": "keyword" + }, + "env": { + "type": "keyword" + } + } + } +} + +PUT clientips/_bulk +{ "index" : {}} +{ "client.ip": "172.21.0.5", "env": "Development" } +{ "index" : {}} +{ "client.ip": "172.21.2.113", "env": "QA" } +{ "index" : {}} +{ "client.ip": "172.21.2.162", "env": "QA" } +{ "index" : {}} +{ "client.ip": "172.21.3.15", "env": "Production" } +{ "index" : {}} +{ "client.ip": "172.21.3.16", "env": "Production" } + +PUT /_enrich/policy/clientip_policy +{ + "match": { + "indices": "clientips", + "match_field": "client.ip", + "enrich_fields": ["env"] + } +} + +PUT /_enrich/policy/clientip_policy/_execute +---- + +After creating and executing a policy, you can use it with the `ENRICH` +command: + +[source,esql] +---- +FROM sample_data +| KEEP @timestamp, client.ip, event.duration +| EVAL client.ip = TO_STRING(client.ip) +| ENRICH clientip_policy +---- + +You can use the new `env` column that's added by the `ENRICH` command in +subsequent commands. For example, to calculate the median duration per +environment: + +[source,esql] +---- +FROM sample_data +| KEEP @timestamp, client.ip, event.duration +| EVAL client.ip = TO_STRING(client.ip) +| ENRICH clientip_policy +| STATS median_duration = MEDIAN(event.duration) BY env +---- + +For more about data enrichment with {esql}, refer to <>. [discrete] [[esql-getting-started-process-data]] -==== Process data +=== Process data +Your data may contain unstructured strings that you want to +<> to make it easier to +analyze the data. For example, the sample data contains log messages like: +[source,txt] +---- +"Connected to 10.1.0.3" +---- + +By extracting the IP address from messages like this, you can determine which IP +has accepted the most client connections. + +To structure unstructured strings at query time, you can use the {esql} +<> and <> commands. `DISSECT` works by breaking up a +string using a delimiter-based pattern. `GROK` works similarly, but uses regular +expressions. This makes `GROK` more powerful, but generally also slower. + +In this case, no regular expressions are needed, as the `message` is +straightforward: "Connected to ", followed by the server IP. To match this +string, you can use the following `DISSECT` command: + +[source,esql] +---- +FROM sample_data +| DISSECT message "Connected to %{server.ip}" +---- + +This adds a `server.ip` column to those rows that have a `message` that matches +this pattern. For other rows, the value of `server.ip` is `null`. + +You can use the new `server.ip` column that's added by the `ENRICH` command in +subsequent commands. For example, to determine how many connections each server +has accepted: + +[source,esql] +---- +FROM sample_data +| WHERE STARTS_WITH(message, "Connected to") +| DISSECT message "Connected to %{server.ip}" +| STATS COUNT(*) BY server.ip +---- + +For more about data processing with {esql}, refer to +<>. [discrete] -[[esql-getting-started-enrich]] -==== Enrich data +[[esql-getting-learn-more]] +=== Learn more + +To learn more about {esql}, refer to <>. \ No newline at end of file diff --git a/docs/reference/esql/esql-kibana.asciidoc b/docs/reference/esql/esql-kibana.asciidoc index b8709364367b2..64d75c3c1b74f 100644 --- a/docs/reference/esql/esql-kibana.asciidoc +++ b/docs/reference/esql/esql-kibana.asciidoc @@ -17,10 +17,12 @@ data* on the *Sample web logs* card. [[esql-kibana-get-started]] === Get started with {esql} +// tag::esql-mode[] To get started with {esql} in Discover, open the main menu and select *Discover*. Next, from the Data views menu, select *Try ES|QL*. image::images/esql/esql-data-view-menu.png[align="center",width=33%] +// end::esql-mode[] The ability to select {esql} from the Data views menu can be enabled and disabled using the `discover:enableESQL` setting from @@ -48,10 +50,12 @@ limits the number of rows that are retrieved. TIP: Click the help icon (image:images/esql/esql-icon-help.svg[]) to open the in-product reference documentation for all commands and functions. +// tag::autocomplete[] To make it easier to write queries, auto-complete offers suggestions with possible commands and functions: image::images/esql/esql-kibana-auto-complete.png[align="center"] +// end::autocomplete[] [NOTE] ==== diff --git a/docs/reference/esql/esql-process-data-with-dissect-grok.asciidoc b/docs/reference/esql/esql-process-data-with-dissect-grok.asciidoc index 43b4a2a15f92f..a37989b2b2da8 100644 --- a/docs/reference/esql/esql-process-data-with-dissect-grok.asciidoc +++ b/docs/reference/esql/esql-process-data-with-dissect-grok.asciidoc @@ -21,7 +21,7 @@ use the {esql} <> and <> commands. ==== `DISSECT` or `GROK`? Or both? `DISSECT` works by breaking up a string using a delimiter-based pattern. `GROK` -works similarly, but uses regular expressions. This make `GROK` more powerful, +works similarly, but uses regular expressions. This makes `GROK` more powerful, but generally also slower. `DISSECT` works well when data is reliably repeated. `GROK` is a better choice when you really need the power of regular expressions, for example when the structure of your text varies from row to row. diff --git a/docs/reference/images/esql/esql-keep.png b/docs/reference/images/esql/esql-keep.png new file mode 100644 index 0000000000000000000000000000000000000000..35d78acaff744c60f0f52c59a75fa865c0deb282 GIT binary patch literal 18686 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 Op{c5;Qlb27$o~Ob0#^P2 literal 0 HcmV?d00001 diff --git a/docs/reference/images/esql/esql-limit.png b/docs/reference/images/esql/esql-limit.png new file mode 100644 index 0000000000000000000000000000000000000000..26bb09ac52c33cf301aca898e40fbb8c42ecdbba GIT binary patch literal 18286 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≷s&X7QrrD`X~ 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 Op{c5;Qlb27$o~Ob0#^P2 literal 0 HcmV?d00001 diff --git a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc index ffc80571b8814..0fc2d164a1d6e 100644 --- a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc +++ b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc @@ -1,12 +1,44 @@ // tag::console[] -Console +To get started with {esql} in Console, open the main menu and select +*Dev Tools*. +The general structure of an <> request is: + +[source,console] +---- +POST /_query?format=txt +{ + "query": """ + + """ +} +---- +// TEST[skip:not an actual query] + +Enter the actual {esql} query between the two sets of triple quotes. For +example: + +[source,console] +---- +POST /_query?format=txt +{ + "query": """ +FROM sample_data + """ +} +---- +// TEST[skip:illustrative only] // end::console[] // tag::discover[] -Discover +include::../../esql/esql-kibana.asciidoc[tag=esql-mode] + +After switching to {esql} mode, the query bar shows a sample query. You can +change that query into the queries in this getting started guide. + +include::../../esql/esql-kibana.asciidoc[tag=autocomplete] // end::discover[] From 5024e3dc36ebed10c0ca5bb7303eabe25e267a43 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Tue, 31 Oct 2023 19:56:11 +0100 Subject: [PATCH 3/9] Fix build errors --- docs/reference/esql/esql-get-started.asciidoc | 8 ++++++++ .../tab-widgets/esql/esql-getting-started.asciidoc | 6 ++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index 717dadb746f65..14572f5d2ab2c 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -338,6 +338,14 @@ PUT /_enrich/policy/clientip_policy PUT /_enrich/policy/clientip_policy/_execute ---- +//// +[source,console] +---- +DELETE /_enrich/policy/clientip_policy +---- +// TEST[continued] +//// + After creating and executing a policy, you can use it with the `ENRICH` command: diff --git a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc index 0fc2d164a1d6e..d7cb28d639af7 100644 --- a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc +++ b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc @@ -5,7 +5,7 @@ To get started with {esql} in Console, open the main menu and select The general structure of an <> request is: -[source,console] +[source,txt] ---- POST /_query?format=txt { @@ -14,12 +14,11 @@ POST /_query?format=txt """ } ---- -// TEST[skip:not an actual query] Enter the actual {esql} query between the two sets of triple quotes. For example: -[source,console] +[source,txt] ---- POST /_query?format=txt { @@ -28,7 +27,6 @@ FROM sample_data """ } ---- -// TEST[skip:illustrative only] // end::console[] From 8d5a4aaa9bf9ede28952b5c4c601219e2872401a Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Wed, 1 Nov 2023 11:07:40 +0100 Subject: [PATCH 4/9] Small improvements --- docs/reference/esql/esql-get-started.asciidoc | 21 ++++++++++--------- docs/reference/esql/esql-kibana.asciidoc | 2 ++ .../esql/esql-getting-started.asciidoc | 4 +++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index 14572f5d2ab2c..abd60fb1b88f3 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -66,6 +66,7 @@ image::images/esql/source-command.svg[A source command producing a table from {e The <> source command returns a table with documents from a data stream, index, or alias. Each row in the resulting table represents a document. +This query returns up to 500 documents from the `sample_data` index: [source,esql] ---- @@ -99,7 +100,7 @@ aggregation, and more. image::images/esql/esql-limit.png[A processing command changing an input table,align="center",width="60%"] For example, you can use the <> command to limit the number of rows -that are returned, to a maximum of 10,000 rows: +that are returned, up to a maximum of 10,000 rows: [source,esql] ---- @@ -174,7 +175,7 @@ of a query is the table produced by the final processing command. image::images/esql/esql-sort-limit.png[Processing commands can be chained,align="center"] -The following example first sorts the rows on `@timestamp`, and next limits the +The following example first sorts the table on `@timestamp`, and next limits the result set to 3 rows: [source,esql] @@ -185,8 +186,8 @@ FROM sample_data ---- NOTE: The order of processing commands is important. First limiting the result -set to 3 rows before sorting those 3 rows could result in 3 different rows being -returned. +set to 3 rows before sorting those 3 rows would most like return 3 different +rows. [discrete] [[esql-getting-started-eval]] @@ -294,9 +295,9 @@ image::images/esql/esql-enrich.png[align="center"] Before you can use `ENRICH`, you first need to <> and <> -an <>. The following requests create a policy -that links an IP address to an environment ("Development", "QA", or -"Production"): +an <>. The following requests create and +execute a policy that links an IP address to an environment ("Development", +"QA", or "Production"): [source,console] ---- @@ -385,8 +386,8 @@ analyze the data. For example, the sample data contains log messages like: "Connected to 10.1.0.3" ---- -By extracting the IP address from messages like this, you can determine which IP -has accepted the most client connections. +By extracting the IP address from these messages, you can determine which IP has +accepted the most client connections. To structure unstructured strings at query time, you can use the {esql} <> and <> commands. `DISSECT` works by breaking up a @@ -425,4 +426,4 @@ For more about data processing with {esql}, refer to [[esql-getting-learn-more]] === Learn more -To learn more about {esql}, refer to <>. \ No newline at end of file +To learn more about {esql}, refer to <> and <>. \ No newline at end of file diff --git a/docs/reference/esql/esql-kibana.asciidoc b/docs/reference/esql/esql-kibana.asciidoc index 64d75c3c1b74f..5205c45140877 100644 --- a/docs/reference/esql/esql-kibana.asciidoc +++ b/docs/reference/esql/esql-kibana.asciidoc @@ -80,6 +80,7 @@ FROM kibana_sample_data_logs | LIMIT 10 ---- +// tag::compact[] To make it easier to write multi-line queries, click the double-headed arrow button (image:images/esql/esql-icon-expand-query-bar.svg[]) to expand the query bar: @@ -88,6 +89,7 @@ image::images/esql/esql-expanded-query-bar.png[align="center"] To return to a compact query bar, click the minimize editor button (image:images/esql/esql-icon-minimize-query-bar.svg[]). +// end::compact[] [discrete] ==== Warnings diff --git a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc index d7cb28d639af7..0ebcb7c92e59f 100644 --- a/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc +++ b/docs/reference/tab-widgets/esql/esql-getting-started.asciidoc @@ -35,8 +35,10 @@ FROM sample_data include::../../esql/esql-kibana.asciidoc[tag=esql-mode] After switching to {esql} mode, the query bar shows a sample query. You can -change that query into the queries in this getting started guide. +replace this query with the queries in this getting started guide. include::../../esql/esql-kibana.asciidoc[tag=autocomplete] +include::../../esql/esql-kibana.asciidoc[tag=compact] + // end::discover[] From abb30bc53b7edc4df1740fe92858db9de9686ba4 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Wed, 1 Nov 2023 11:10:57 +0100 Subject: [PATCH 5/9] Typo --- docs/reference/esql/esql-get-started.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index abd60fb1b88f3..2ea588deb40e5 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -186,7 +186,7 @@ FROM sample_data ---- NOTE: The order of processing commands is important. First limiting the result -set to 3 rows before sorting those 3 rows would most like return 3 different +set to 3 rows before sorting those 3 rows would most likely return 3 different rows. [discrete] From ef98e99c18113f1318bb61927da5ebb722562264 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Wed, 1 Nov 2023 13:52:05 +0100 Subject: [PATCH 6/9] Add link to public demo environment --- docs/reference/esql/esql-get-started.asciidoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index 2ea588deb40e5..e45e8859754e7 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -7,6 +7,11 @@ This guide shows you can use {esql} to query and aggregate your data. +TIP: To get started with {esql} without setting up your own deployment, visit +the public {esql} demo environment at +https://esql.demo.elastic.co/[esql.demo.elastic.co]. It comes with preloaded +data sets and sample queries. + [discrete] [[esql-getting-started-prerequisites]] === Prerequisites From e02acec617d11e3315b1e9c700e559be56f0bdd8 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Fri, 3 Nov 2023 10:56:19 +0100 Subject: [PATCH 7/9] Review feedback --- docs/reference/esql/esql-get-started.asciidoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index e45e8859754e7..d767c24f12879 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -198,10 +198,10 @@ rows. [[esql-getting-started-eval]] === Compute values -Use the <> command to append rows to a table, with calculated values. -For example, the following query appends a `duration_ms` column. The values in -the column are computed by dividing `event.duration` by 1,000,000. In other -words: `event.duration` converted from nanoseconds to milliseconds. +Use the <> command to append columns to a table, with calculated +values. For example, the following query appends a `duration_ms` column. The +values in the column are computed by dividing `event.duration` by 1,000,000. In +other words: `event.duration` converted from nanoseconds to milliseconds. [source,esql] ---- @@ -360,7 +360,7 @@ command: FROM sample_data | KEEP @timestamp, client.ip, event.duration | EVAL client.ip = TO_STRING(client.ip) -| ENRICH clientip_policy +| ENRICH clientip_policy ON client.ip WITH env ---- You can use the new `env` column that's added by the `ENRICH` command in @@ -372,7 +372,7 @@ environment: FROM sample_data | KEEP @timestamp, client.ip, event.duration | EVAL client.ip = TO_STRING(client.ip) -| ENRICH clientip_policy +| ENRICH clientip_policy ON client.ip WITH env | STATS median_duration = MEDIAN(event.duration) BY env ---- @@ -412,7 +412,7 @@ FROM sample_data This adds a `server.ip` column to those rows that have a `message` that matches this pattern. For other rows, the value of `server.ip` is `null`. -You can use the new `server.ip` column that's added by the `ENRICH` command in +You can use the new `server.ip` column that's added by the `DISSECT` command in subsequent commands. For example, to determine how many connections each server has accepted: From ce487a8793a05ba35eb7890b88f10c62e702a0d5 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Fri, 3 Nov 2023 11:00:38 +0100 Subject: [PATCH 8/9] Update docs/reference/esql/esql-get-started.asciidoc Co-authored-by: Andrei Stefan --- docs/reference/esql/esql-get-started.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index d767c24f12879..49802146a0e91 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -5,7 +5,7 @@ Getting started ++++ -This guide shows you can use {esql} to query and aggregate your data. +This guide shows how you can use {esql} to query and aggregate your data. TIP: To get started with {esql} without setting up your own deployment, visit the public {esql} demo environment at From 1a9b5b8157fa669e6f311f6bf7a8e210aa409f15 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Fri, 3 Nov 2023 13:13:28 +0100 Subject: [PATCH 9/9] Review feedback --- docs/reference/esql/esql-get-started.asciidoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/reference/esql/esql-get-started.asciidoc b/docs/reference/esql/esql-get-started.asciidoc index 49802146a0e91..82831ef943398 100644 --- a/docs/reference/esql/esql-get-started.asciidoc +++ b/docs/reference/esql/esql-get-started.asciidoc @@ -191,8 +191,8 @@ FROM sample_data ---- NOTE: The order of processing commands is important. First limiting the result -set to 3 rows before sorting those 3 rows would most likely return 3 different -rows. +set to 3 rows before sorting those 3 rows would most likely return a result that +is different than this example, where the sorting comes before the limit. [discrete] [[esql-getting-started-eval]] @@ -241,7 +241,7 @@ FROM sample_data | STATS median_duration = MEDIAN(event.duration), max_duration = MAX(event.duration) ---- -Use `BY` to group calculated stats by one or more other values. For example, to +Use `BY` to group calculated stats by one or more columns. For example, to calculate the median duration per client IP: [source,esql] @@ -255,9 +255,9 @@ FROM sample_data === Create a histogram To track statistics over time, {esql} enables you to create histograms using the -<> function. `AUTO_BUCKET` creates human-friendly buckets and -returns a value for each row that corresponds to the resulting bucket the row -falls into. +<> function. `AUTO_BUCKET` creates human-friendly bucket sizes +and returns a value for each row that corresponds to the resulting bucket the +row falls into. For example, to create hourly buckets for the data on October 23rd: