From 8f8c2b4d90bfcf089a28ecd7e7a40b16c40bf2ed Mon Sep 17 00:00:00 2001 From: kosabogi Date: Fri, 25 Sep 2026 09:23:15 +0200 Subject: [PATCH 01/48] Initial structure --- solutions/search/set-up.md | 22 +++++++++++++++++++ .../search/set-up/api-key-and-endpoints.md | 14 ++++++++++++ .../search/set-up/connect-through-an-sdk.md | 14 ++++++++++++ .../set-up/get-started-with-elasticsearch.md | 14 ++++++++++++ solutions/toc.yml | 5 +++++ 5 files changed, 69 insertions(+) create mode 100644 solutions/search/set-up.md create mode 100644 solutions/search/set-up/api-key-and-endpoints.md create mode 100644 solutions/search/set-up/connect-through-an-sdk.md create mode 100644 solutions/search/set-up/get-started-with-elasticsearch.md diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md new file mode 100644 index 00000000000..53a82e57ee8 --- /dev/null +++ b/solutions/search/set-up.md @@ -0,0 +1,22 @@ +--- +applies_to: + stack: + serverless: +products: + - id: elasticsearch + - id: cloud-serverless +navigation_title: Set up +description: Compare Elasticsearch deployment options for search and choose where to run your project. +--- + +# Set up + +Compare deployment options and get connected to {{es}} for search. + +This page will include a side-by-side comparison of Vector Database Serverless, {{es}} Serverless, Elastic Cloud Hosted, and self-managed deployments. + +## In this section + +- [](/solutions/search/set-up/get-started-with-elasticsearch.md) +- [](/solutions/search/set-up/api-key-and-endpoints.md) +- [](/solutions/search/set-up/connect-through-an-sdk.md) diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md new file mode 100644 index 00000000000..4fef59f8b4d --- /dev/null +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -0,0 +1,14 @@ +--- +applies_to: + stack: + serverless: +products: + - id: elasticsearch + - id: cloud-serverless +navigation_title: API key and endpoints +description: Find your Elasticsearch endpoint and API key so you can connect from a client. +--- + +# Get your API key and endpoints + +Find your connection details and scope an API key for search. The steps apply across deployment types. diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md new file mode 100644 index 00000000000..f31dfb48bac --- /dev/null +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -0,0 +1,14 @@ +--- +applies_to: + stack: + serverless: +products: + - id: elasticsearch + - id: cloud-serverless +navigation_title: Connect through an SDK +description: Install an official Elasticsearch language client and connect it to your deployment. +--- + +# Connect through an SDK + +Install and configure an official {{es}} language client to connect to a project or cluster. diff --git a/solutions/search/set-up/get-started-with-elasticsearch.md b/solutions/search/set-up/get-started-with-elasticsearch.md new file mode 100644 index 00000000000..4d691e4177d --- /dev/null +++ b/solutions/search/set-up/get-started-with-elasticsearch.md @@ -0,0 +1,14 @@ +--- +applies_to: + stack: + serverless: +products: + - id: elasticsearch + - id: cloud-serverless +navigation_title: Get started with Elasticsearch +description: Create an Elasticsearch deployment for search, independent of a specific project or hosting type. +--- + +# Get started with Elasticsearch + +Short, deployment-agnostic steps for creating an {{es}} deployment for search. diff --git a/solutions/toc.yml b/solutions/toc.yml index dcf2b3fd607..092b1980a6f 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -11,6 +11,11 @@ toc: - file: search/get-started/index-basics.md - file: search/get-started/keyword-search-python.md - file: search/get-started/semantic-search.md + - file: search/set-up.md + children: + - file: search/set-up/get-started-with-elasticsearch.md + - file: search/set-up/api-key-and-endpoints.md + - file: search/set-up/connect-through-an-sdk.md - file: search/ingest-for-search.md children: - file: search/search-pipelines.md From 4d21214c97e6e205e0ed2cb8901538eaefa6018f Mon Sep 17 00:00:00 2001 From: kosabogi Date: Wed, 30 Sep 2026 13:17:55 +0200 Subject: [PATCH 02/48] Adds deploymet types page --- solutions/search/set-up.md | 23 +++++----- .../search/set-up/choose-a-deployment-type.md | 45 +++++++++++++++++++ .../set-up/get-started-with-elasticsearch.md | 14 ------ solutions/toc.yml | 2 +- 4 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 solutions/search/set-up/choose-a-deployment-type.md delete mode 100644 solutions/search/set-up/get-started-with-elasticsearch.md diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 53a82e57ee8..78a2e455085 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -4,19 +4,22 @@ applies_to: serverless: products: - id: elasticsearch + - id: kibana - id: cloud-serverless + - id: serverless-vector-database + - id: cloud-hosted + - id: cloud-enterprise + - id: cloud-kubernetes + - id: elastic-stack navigation_title: Set up -description: Compare Elasticsearch deployment options for search and choose where to run your project. +description: Prepare Elasticsearch for search by selecting a deployment type, then connecting with an endpoint, API key, and language client. +type: overview --- -# Set up +# Set up Elasticsearch for search [set-up-elasticsearch-for-search] -Compare deployment options and get connected to {{es}} for search. +This section covers where {{es}} runs for a search application and how you connect to it. Refer to the following pages to set up your {{es}} deployment: -This page will include a side-by-side comparison of Vector Database Serverless, {{es}} Serverless, Elastic Cloud Hosted, and self-managed deployments. - -## In this section - -- [](/solutions/search/set-up/get-started-with-elasticsearch.md) -- [](/solutions/search/set-up/api-key-and-endpoints.md) -- [](/solutions/search/set-up/connect-through-an-sdk.md) +* [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types and select one for your search workload. +* [](/solutions/search/set-up/api-key-and-endpoints.md): Find the {{es}} endpoint and create an API key for search. +* [](/solutions/search/set-up/connect-through-an-sdk.md): Install an official language client and connect it to your deployment. diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md new file mode 100644 index 00000000000..44e8680fed1 --- /dev/null +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -0,0 +1,45 @@ +--- +applies_to: + stack: + serverless: +products: + - id: elasticsearch + - id: kibana + - id: cloud-serverless + - id: serverless-vector-database + - id: cloud-hosted + - id: cloud-enterprise + - id: cloud-kubernetes + - id: elastic-stack +navigation_title: Choose a deployment type +description: Compare Elasticsearch deployment types for search, including billing, Kibana tools, custom machine learning models, and index lifecycle management. +type: overview +--- + +# Choose a deployment type [choose-a-deployment-type] + +{{es}} runs on several deployment types, and each type fits different operational needs. This page covers the deployment types for search. The type you select sets who operates the cluster, how usage is billed, and which {{kib}} search tools you can use. + +For most search workloads, we recommend an [{{es}} {{vectordb}} project](/solutions/vector-database.md). You get vector-tuned defaults, {{infer}} for embeddings, and billing based on storage and reserved search capacity. + +If you need custom models on {{ml}} nodes, time series or logs index modes, or {{kib}} tools such as the Query Rules UI, use an [{{es}} project](/solutions/elasticsearch-solution-project.md) on {{serverless-full}}, or select [{{ech}}](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md) or a [self-managed deployment](/deploy-manage/deploy/self-managed.md). + +## Compare deployment options [compare-search-deployments] + +The following table helps you select a deployment type for a search workload. + +| Capability | [{{serverless-short}}: {{es}} {{vectordb}} project](/solutions/vector-database.md) | [{{serverless-short}}: {{es}} project](/solutions/elasticsearch-solution-project.md) | [{{ech}}](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md) | [Self-managed](/deploy-manage/deploy/self-managed.md) | +| --- | --- | --- | --- | --- | +| Who manages the cluster | Elastic | Elastic | Elastic hosts it. You size it and control upgrades. | You install, scale, and upgrade it. | +| [Vector-tuned defaults](/solutions/vector-database.md) | Automatic | You configure them | You configure them | You configure them | +| [Synonyms UI](/solutions/search/full-text/search-with-synonyms.md#synonyms-store-synonyms-kibana) | No | Yes | Yes | Yes | +| [Query Rules UI](/solutions/elasticsearch-solution-project/query-rules-ui.md) | No | Yes | Yes | Yes | +| [{{agent-builder}}](/explore-analyze/ai-features/elastic-agent-builder.md) {applies_to}`stack: ga 9.3+` | Yes | Yes | Yes | Yes | +| Custom models on {{ml}} nodes | No | Yes | Yes | Yes | +| {{ilm-cap}} | No | No | Yes | Yes | +| Learn more | [](/solutions/vector-database/get-started.md) | [](/solutions/elasticsearch-solution-project/get-started.md) | [](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md) | [](/deploy-manage/deploy/self-managed.md), [](/deploy-manage/deploy/cloud-on-k8s.md), or [](/deploy-manage/deploy/cloud-enterprise.md) | + + +## Next step [choose-a-deployment-type-next] + +After you select a deployment type, get an endpoint and an API key in [](/solutions/search/set-up/api-key-and-endpoints.md). diff --git a/solutions/search/set-up/get-started-with-elasticsearch.md b/solutions/search/set-up/get-started-with-elasticsearch.md deleted file mode 100644 index 4d691e4177d..00000000000 --- a/solutions/search/set-up/get-started-with-elasticsearch.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -applies_to: - stack: - serverless: -products: - - id: elasticsearch - - id: cloud-serverless -navigation_title: Get started with Elasticsearch -description: Create an Elasticsearch deployment for search, independent of a specific project or hosting type. ---- - -# Get started with Elasticsearch - -Short, deployment-agnostic steps for creating an {{es}} deployment for search. diff --git a/solutions/toc.yml b/solutions/toc.yml index 092b1980a6f..1ea67c56967 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -13,7 +13,7 @@ toc: - file: search/get-started/semantic-search.md - file: search/set-up.md children: - - file: search/set-up/get-started-with-elasticsearch.md + - file: search/set-up/choose-a-deployment-type.md - file: search/set-up/api-key-and-endpoints.md - file: search/set-up/connect-through-an-sdk.md - file: search/ingest-for-search.md From bd01db1ee31784b1a89975769eba212697ce0bf5 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Wed, 7 Oct 2026 14:54:37 +0200 Subject: [PATCH 03/48] Adds content of other pages --- .../find-endpoint-serverless-console.md | 12 + error-start-local.log | 11 + .../_snippets/create-an-api-key.md | 30 + .../_snippets/find-elasticsearch-endpoint.md | 82 ++ .../search-connection-details.md | 110 +-- solutions/search/set-up.md | 9 - .../serverless-project-type-comparison.md | 10 + .../search/set-up/api-key-and-endpoints.md | 28 +- .../search/set-up/choose-a-deployment-type.md | 50 +- .../search/set-up/connect-through-an-sdk.md | 901 +++++++++++++++++- 10 files changed, 1089 insertions(+), 154 deletions(-) create mode 100644 deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md create mode 100644 error-start-local.log create mode 100644 solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md create mode 100644 solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md create mode 100644 solutions/search/set-up/_snippets/serverless-project-type-comparison.md diff --git a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md new file mode 100644 index 00000000000..dca38f994d3 --- /dev/null +++ b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md @@ -0,0 +1,12 @@ +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. +2. Find your project and select **Manage**. +3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. +4. Copy the **Endpoint** value. + + :::{image} /solutions/images/cloud-console-serverless-endpoint.png + :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons + :screenshot: + :width: 50% + ::: + +If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). diff --git a/error-start-local.log b/error-start-local.log new file mode 100644 index 00000000000..5145235acad --- /dev/null +++ b/error-start-local.log @@ -0,0 +1,11 @@ +Error: docker compose up --wait command failed! +Start-local version: 0.14.0 +Docker engine: Docker version 29.8.2, build 7fc2dff +Docker compose: 5.5.1 +Elastic Stack version: 9.5.5 +Distribution: macOS +Version: 26.6.2 +-- Logs of service es-local-dev: +Created elasticsearch keystore in /usr/share/elasticsearch/config/elasticsearch.keystore +-- Logs of service kibana-local-dev: +-- Logs of service kibana-local-settings: diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md new file mode 100644 index 00000000000..8b646d19a02 --- /dev/null +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -0,0 +1,30 @@ + + +:::::{applies-switch} + +::::{applies-item} { "deployment": { "ech": "ga", "ece": "ga" }, "serverless": "ga" } + +1. Open {{kib}} for your deployment or project. +2. From the **Help menu** {icon}`question`, select **Connection details**. +3. Select the **API key** tab. +4. In the **API key name** field, enter a name, then select **Create API key**. +5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. +6. Copy the key. It isn't available after you close the panel. + +Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. +:::: + +::::{applies-item} {"deployment": {"eck": "ga", "self": "ga"}} +1. Go to the **API keys** management page, using the [global search field](/explore-analyze/find-and-organize/find-apps-and-objects.md) to find it. +2. Select **Create API key**. +3. Enter a name, then select **Create API key**. +4. Copy the key. It isn't available after you leave the page. + +Keys created here don't expire unless you add an expiration date. +:::: + +::::: diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md new file mode 100644 index 00000000000..101698c4d64 --- /dev/null +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -0,0 +1,82 @@ + + +:::::{applies-switch} + +::::{applies-item} serverless: ga +Your endpoint details are on your project's page in the {{ecloud}} Console. + +:::{include} /deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md +::: + +:::{tip} +You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. +::: +:::: + +::::{applies-item} ech: ga +Your endpoint details are on your deployment's page in the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body). + +1. In the {{ecloud}} Console, select **Hosted**. +2. Select your deployment. +3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. +4. Copy the **Endpoint** value. + + :::{image} /solutions/images/cloud-console-hosted-endpoint.png + :alt: The Elasticsearch panel on a hosted deployment page in the Elastic Cloud Console, showing the Endpoint value with a copy button + :screenshot: + :width: 50% + ::: + +:::{tip} +You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question`, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. +::: +:::: + +::::{applies-item} ece: ga +Your endpoint details are in the **Connection details** panel in {{kib}}. + +1. Open {{kib}} for your deployment. +2. From the **Help menu** {icon}`question`, select **Connection details**. +3. Copy the **{{es}} endpoint** from the **Endpoints** tab. + +:::{image} /solutions/images/kibana-connection-details-endpoints.png +:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab +:screenshot: +:width: 50% +::: + +:::{tip} +When the space uses the **{{es}}** solution view, the **Getting started** page shows the endpoint directly. +::: + +:::: + +::::{applies-item} {"deployment": {"self": "ga"}} +Your endpoint takes the form `://:`. Each part comes from your cluster's HTTP settings: + +* **Scheme**: `https` when TLS is enabled on the HTTP layer, and `http` when it isn't. [Automatic security setup](/deploy-manage/security/self-auto-setup.md) enables TLS on a new archive or package installation. +* **Host**: The address clients use to reach the node, set by [`http.host` or `network.host`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). +* **Port**: The HTTP port, set by [`http.port`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). It defaults to the range `9200-9300`, and a node binds to the first free port in that range. + +For example, a single-node cluster from the [local development quickstart](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) runs without TLS on the default port, so its endpoint is `http://localhost:9200`. + +If clients reach your cluster through a load balancer, reverse proxy, or ingress, use that address rather than the node address. +:::: + +::::{applies-item} {"deployment": {"eck": "ga"}} +The {{eck}} operator creates a `ClusterIP` service named `-es-http` on port `9200`, with TLS enabled by default. + +From inside the Kubernetes cluster, your endpoint is `https://-es-http:9200` in the same namespace, or `https://-es-http..svc:9200` from another namespace. List your services to confirm the name: + +```sh +kubectl get svc +``` + +To reach the cluster from outside, expose the service and use its external address. Refer to [Access the endpoint](/deploy-manage/deploy/cloud-on-k8s/accessing-services.md#k8s-request-elasticsearch-endpoint) for both cases, including how to retrieve the certificate authority (CA) certificate. +:::: + +::::: diff --git a/solutions/elasticsearch-solution-project/search-connection-details.md b/solutions/elasticsearch-solution-project/search-connection-details.md index d0857c6aaa9..e8fd017400a 100644 --- a/solutions/elasticsearch-solution-project/search-connection-details.md +++ b/solutions/elasticsearch-solution-project/search-connection-details.md @@ -22,93 +22,9 @@ To create an API key, you need the `manage_api_key` or the `manage_own_api_key` ## Find your {{es}} endpoint [find-endpoint-cloud-self-managed] -:::::{applies-switch} - -::::{applies-item} serverless: ga -Your endpoint details are on your project's page in the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body). - -1. In the {{ecloud}} Console, select **Serverless**. -2. Find your project and select **Manage**. -3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. -4. Copy the **Endpoint** value. - - :::{image} /solutions/images/cloud-console-serverless-endpoint.png - :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons - :screenshot: - :width: 50% - ::: - -If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). - -:::{tip} -You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. -::: -:::: - -::::{applies-item} ech: ga -Your endpoint details are on your deployment's page in the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body). - -1. In the {{ecloud}} Console, select **Hosted**. -2. Select your deployment. -3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. -4. Copy the **Endpoint** value. - - :::{image} /solutions/images/cloud-console-hosted-endpoint.png - :alt: The Elasticsearch panel on a hosted deployment page in the Elastic Cloud Console, showing the Endpoint value with a copy button - :screenshot: - :width: 50% - ::: - -:::{tip} -You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question`, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. -::: +::::{include} _snippets/find-elasticsearch-endpoint.md :::: -::::{applies-item} ece: ga -Your endpoint details are in the **Connection details** panel in {{kib}}. - -1. Open {{kib}} for your deployment. -2. From the **Help menu** {icon}`question`, select **Connection details**. -3. Copy the **{{es}} endpoint** from the **Endpoints** tab. - -:::{image} /solutions/images/kibana-connection-details-endpoints.png -:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab -:screenshot: -:width: 50% -::: - -:::{tip} -When the space uses the **{{es}}** solution view, the **Getting started** page shows the endpoint directly. -::: - -:::: - -::::{applies-item} {"deployment": {"self": "ga"}} -Your endpoint takes the form `://:`. Each part comes from your cluster's HTTP settings: - -* **Scheme**: `https` when TLS is enabled on the HTTP layer, and `http` when it isn't. [Automatic security setup](/deploy-manage/security/self-auto-setup.md) enables TLS on a new archive or package installation. -* **Host**: The address clients use to reach the node, set by [`http.host` or `network.host`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). -* **Port**: The HTTP port, set by [`http.port`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). It defaults to the range `9200-9300`, and a node binds to the first free port in that range. - -For example, a single-node cluster from the [local development quickstart](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) runs without TLS on the default port, so its endpoint is `http://localhost:9200`. - -If clients reach your cluster through a load balancer, reverse proxy, or ingress, use that address rather than the node address. -:::: - -::::{applies-item} {"deployment": {"eck": "ga"}} -The {{eck}} operator creates a `ClusterIP` service named `-es-http` on port `9200`, with TLS enabled by default. - -From inside the Kubernetes cluster, your endpoint is `https://-es-http:9200` in the same namespace, or `https://-es-http..svc:9200` from another namespace. List your services to confirm the name: - -```sh -kubectl get svc -``` - -To reach the cluster from outside, expose the service and use its external address. Refer to [Access the endpoint](/deploy-manage/deploy/cloud-on-k8s/accessing-services.md#k8s-request-elasticsearch-endpoint) for both cases, including how to retrieve the certificate authority (CA) certificate. -:::: - -::::: - ### Find your Cloud ID [find-cloud-id-cloud-self-managed] ```{applies_to} @@ -137,31 +53,9 @@ To skip {{kib}}, select **Hosted** in the {{ecloud}} Console, open your deployme ## Create an API key [create-an-api-key-cloud-self-managed] -:::::{applies-switch} - -::::{applies-item} { "deployment": { "ech": "ga", "ece": "ga" }, "serverless": "ga" } - -1. Open {{kib}} for your deployment or project. -2. From the **Help menu** {icon}`question`, select **Connection details**. -3. Select the **API key** tab. -4. In the **API key name** field, enter a name, then select **Create API key**. -5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. -6. Copy the key. It isn't available after you close the panel. - -Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. -:::: - -::::{applies-item} {"deployment": {"eck": "ga", "self": "ga"}} -1. Go to the **API keys** management page, using the [global search field](/explore-analyze/find-and-organize/find-apps-and-objects.md) to find it. -2. Select **Create API key**. -3. Enter a name, then select **Create API key**. -4. Copy the key. It isn't available after you leave the page. - -Keys created here don't expire unless you add an expiration date. +::::{include} _snippets/create-an-api-key.md :::: -::::: - For key types, privileges, and expiration options, refer to [](/deploy-manage/api-keys.md). ## Test your connection [elasticsearch-get-started-test-connection] diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 78a2e455085..57adc2338ed 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -2,15 +2,6 @@ applies_to: stack: serverless: -products: - - id: elasticsearch - - id: kibana - - id: cloud-serverless - - id: serverless-vector-database - - id: cloud-hosted - - id: cloud-enterprise - - id: cloud-kubernetes - - id: elastic-stack navigation_title: Set up description: Prepare Elasticsearch for search by selecting a deployment type, then connecting with an endpoint, API key, and language client. type: overview diff --git a/solutions/search/set-up/_snippets/serverless-project-type-comparison.md b/solutions/search/set-up/_snippets/serverless-project-type-comparison.md new file mode 100644 index 00000000000..1ada69f14f9 --- /dev/null +++ b/solutions/search/set-up/_snippets/serverless-project-type-comparison.md @@ -0,0 +1,10 @@ + + +| Use case | Example | Recommended project type | +| --- | --- | --- | +| [RAG and question answering](/solutions/search/vector/vector-search-use-cases.md#rag-and-question-answering-on-your-own-data) | A support assistant that retrieves passages from your docs, wikis, and tickets to ground an LLM's answers, mixing natural-language questions with exact product names or ticket IDs | {{es}} {{vectordb}} | +| [Multimodal search](/solutions/search/vector/vector-search-use-cases.md#multimodal-search) | Searching a photo library, or a mixed catalog of video, audio, and text, using embeddings from a multimodal model | {{es}} {{vectordb}} | +| Log, event, or other time series search | Searching and analyzing application logs or metrics that are continuously written and queried by time range | {{es}} project | diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index 4fef59f8b4d..38cb00662c6 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -2,13 +2,29 @@ applies_to: stack: serverless: -products: - - id: elasticsearch - - id: cloud-serverless navigation_title: API key and endpoints -description: Find your Elasticsearch endpoint and API key so you can connect from a client. +description: Find your Elasticsearch endpoint and create an API key so you can connect a search client. +type: how-to --- -# Get your API key and endpoints +# Get your API key and endpoints [get-your-api-key-and-endpoints] -Find your connection details and scope an API key for search. The steps apply across deployment types. +To connect a client to {{es}} for search, you need the endpoint URL and an API key. The steps depend on where your deployment runs. + +## Find your {{es}} endpoint [find-your-elasticsearch-endpoint] + +::::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +:::: + +## Create an API key [create-an-api-key] + +To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. + +::::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +:::: + +For key types, privileges, and expiration options, refer to [](/deploy-manage/api-keys.md). + +## Next step [api-key-and-endpoints-next] + +After you have an endpoint and an API key, connect a language client in [](/solutions/search/set-up/connect-through-an-sdk.md). diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 44e8680fed1..867792a2429 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -2,44 +2,42 @@ applies_to: stack: serverless: -products: - - id: elasticsearch - - id: kibana - - id: cloud-serverless - - id: serverless-vector-database - - id: cloud-hosted - - id: cloud-enterprise - - id: cloud-kubernetes - - id: elastic-stack navigation_title: Choose a deployment type -description: Compare Elasticsearch deployment types for search, including billing, Kibana tools, custom machine learning models, and index lifecycle management. +description: Select an Elasticsearch hosting model for search, compare Serverless project types, and start a deployment. type: overview --- # Choose a deployment type [choose-a-deployment-type] -{{es}} runs on several deployment types, and each type fits different operational needs. This page covers the deployment types for search. The type you select sets who operates the cluster, how usage is billed, and which {{kib}} search tools you can use. +{{es}} runs on several deployment types, and each type fits different operational needs. -For most search workloads, we recommend an [{{es}} {{vectordb}} project](/solutions/vector-database.md). You get vector-tuned defaults, {{infer}} for embeddings, and billing based on storage and reserved search capacity. +The type you select sets who operates the cluster, how usage is billed, and which {{kib}} search tools you can use. This page helps you select the deployment type that fits your needs. -If you need custom models on {{ml}} nodes, time series or logs index modes, or {{kib}} tools such as the Query Rules UI, use an [{{es}} project](/solutions/elasticsearch-solution-project.md) on {{serverless-full}}, or select [{{ech}}](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md) or a [self-managed deployment](/deploy-manage/deploy/self-managed.md). +:::{note} +For most search workloads using vectors, the recommended option is an [{{es}} {{vectordb}} project](/solutions/vector-database.md). Click here to get started with the {{vectordb}}. For a detailed comparison, use the resources in [Select a hosting model](#select-a-hosting-model). +::: -## Compare deployment options [compare-search-deployments] +## Select a hosting model [select-a-hosting-model] -The following table helps you select a deployment type for a search workload. +{{es}} supports these deployment types for search: [{{serverless-short}}](/deploy-manage/deploy/elastic-cloud/serverless.md) (an [{{es}} {{vectordb}} project](/solutions/vector-database.md) or an [{{es}} project](/solutions/elasticsearch-solution-project.md)), [{{ech}}](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md), and [self-managed](/deploy-manage/deploy/self-managed.md). Each hosting model affects who manages the cluster and how it is billed. -| Capability | [{{serverless-short}}: {{es}} {{vectordb}} project](/solutions/vector-database.md) | [{{serverless-short}}: {{es}} project](/solutions/elasticsearch-solution-project.md) | [{{ech}}](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md) | [Self-managed](/deploy-manage/deploy/self-managed.md) | -| --- | --- | --- | --- | --- | -| Who manages the cluster | Elastic | Elastic | Elastic hosts it. You size it and control upgrades. | You install, scale, and upgrade it. | -| [Vector-tuned defaults](/solutions/vector-database.md) | Automatic | You configure them | You configure them | You configure them | -| [Synonyms UI](/solutions/search/full-text/search-with-synonyms.md#synonyms-store-synonyms-kibana) | No | Yes | Yes | Yes | -| [Query Rules UI](/solutions/elasticsearch-solution-project/query-rules-ui.md) | No | Yes | Yes | Yes | -| [{{agent-builder}}](/explore-analyze/ai-features/elastic-agent-builder.md) {applies_to}`stack: ga 9.3+` | Yes | Yes | Yes | Yes | -| Custom models on {{ml}} nodes | No | Yes | Yes | Yes | -| {{ilm-cap}} | No | No | Yes | Yes | -| Learn more | [](/solutions/vector-database/get-started.md) | [](/solutions/elasticsearch-solution-project/get-started.md) | [](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md) | [](/deploy-manage/deploy/self-managed.md), [](/deploy-manage/deploy/cloud-on-k8s.md), or [](/deploy-manage/deploy/cloud-enterprise.md) | +Use the following resources to compare hosting models: +1. Compare deployment options, including self-managed, {{ech}}, and {{serverless-short}}. Refer to [](/deploy-manage/deploy/deployment-comparison.md). +2. Compare {{es-serverless}} and {{es}} {{vectordb}}: + + :::{include} _snippets/serverless-project-type-comparison.md + ::: + +## Start a deployment [start-a-deployment] + +After you have selected a deployment type, start with one of these guides: + +* {{es}} {{vectordb}} project: [](/solutions/vector-database/get-started.md) +* {{es}} project ({{serverless-short}}): [](/solutions/elasticsearch-solution-project/get-started.md) +* {{ech}}: [](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md) +* Self-managed: [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) ## Next step [choose-a-deployment-type-next] -After you select a deployment type, get an endpoint and an API key in [](/solutions/search/set-up/api-key-and-endpoints.md). +After you have selected and started a deployment, get connected: find your endpoint and create an API key in [](/solutions/search/set-up/api-key-and-endpoints.md). diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index f31dfb48bac..77f975b5a7d 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -2,13 +2,904 @@ applies_to: stack: serverless: -products: - - id: elasticsearch - - id: cloud-serverless navigation_title: Connect through an SDK -description: Install an official Elasticsearch language client and connect it to your deployment. +description: Install an official Elasticsearch language client, connect it with your endpoint and API key, and verify the connection. +type: how-to --- -# Connect through an SDK +# Connect through an SDK [connect-through-an-sdk] Install and configure an official {{es}} language client to connect to a project or cluster. + +## Connect to your project [connect-through-an-sdk-connect] + +Set the project endpoint and API key as environment variables: + +:::::{tab-set} +:group: operating-systems + +::::{tab-item} macOS and Linux +:sync: macos-linux + +```bash +export ES_URL="" <1> +export ES_API_KEY="YOUR_API_KEY" +``` + +1. For example, `https://my-project.es.us-east-1.aws.elastic.cloud:443`. + +:::: + +::::{tab-item} Windows PowerShell +:sync: windows-powershell + +```powershell +$Env:ES_URL = "" <1> +$Env:ES_API_KEY = "YOUR_API_KEY" +``` + +1. For example, `https://my-project.es.us-east-1.aws.elastic.cloud:443`. + +:::: + +::::: + +## Install and initialize a client [connect-through-an-sdk-install] + +Install the client for your language. For a list of available clients, refer to [{{es}} clients](/reference/elasticsearch-clients/index.md). + +:::::{tab-set} +:group: languages + +::::{tab-item} Python +:sync: python + +```bash +pip install elasticsearch +``` + +For supported Python versions and other requirements, refer to the [Python client documentation](elasticsearch-py://reference/getting-started.md#_requirements). + +:::: + +::::{tab-item} TypeScript +:sync: typescript + +```bash +npm install @elastic/elasticsearch +npm install --save-dev typescript tsx +npm pkg set type=module +``` + +For supported Node.js versions and other requirements, refer to the [JavaScript client documentation](elasticsearch-js://reference/index.md). + +:::: + +::::{tab-item} PHP +:sync: php + +```bash +composer require elasticsearch/elasticsearch +``` + +For supported PHP versions and other requirements, refer to the [PHP client documentation](elasticsearch-php://reference/index.md). + +:::: + +::::{tab-item} Ruby +:sync: ruby + +```bash +bundle add elasticsearch +``` + +For supported Ruby versions and other requirements, refer to the [Ruby client installation documentation](elasticsearch-ruby://reference/installation.md). + +:::: + +::::{tab-item} C#/.NET +:sync: csharp + +```bash +dotnet add package Elastic.Clients.Elasticsearch +``` + +For supported .NET versions and other requirements, refer to the [.NET client documentation](elasticsearch-net://reference/index.md). + +:::: + +::::{tab-item} Java +:sync: java + +Add the client dependency and the runnable example's main class to the generated `build.gradle` file: + +```groovy +dependencies { + implementation "co.elastic.clients:elasticsearch-java:VERSION" +} + +application { + mainClass = "quickstart.App" +} +``` + +Replace `VERSION` with the version from the [latest Java client release](https://github.com/elastic/elasticsearch-java/releases). For supported Java versions and other requirements, refer to the [Java client documentation](elasticsearch-java://reference/index.md). + +:::: + +::::{tab-item} Go +:sync: go + +```bash +go get github.com/elastic/go-elasticsearch/v9 +``` + +For supported Go versions and other requirements, refer to the [Go client installation documentation](https://www.elastic.co/docs/reference/elasticsearch/clients/go/installation). + +:::: + +::::: + +After installation, initialize the client: + +:::::{tab-set} +:group: languages + +::::{tab-item} Python +:sync: python + +```python +import os +from elasticsearch import Elasticsearch, helpers + +es = Elasticsearch( + os.environ["ES_URL"], + api_key=os.environ["ES_API_KEY"], +) +``` + +:::: + +::::{tab-item} TypeScript +:sync: typescript + +```typescript +import { Client } from "@elastic/elasticsearch"; + +const es = new Client({ + node: process.env.ES_URL, + auth: { apiKey: process.env.ES_API_KEY! }, +}); +``` + +:::: + +::::{tab-item} PHP +:sync: php + +```php +setHosts([getenv("ES_URL")]) + ->setApiKey(getenv("ES_API_KEY")) + ->build(); +``` + +:::: + +::::{tab-item} Ruby +:sync: ruby + +```ruby +require "elasticsearch" + +es = Elasticsearch::Client.new( + url: ENV.fetch("ES_URL"), + api_key: ENV.fetch("ES_API_KEY") +) +``` + +:::: + +::::{tab-item} C#/.NET +:sync: csharp + +```csharp +using System.Text.Json; +using System.Text.Json.Serialization; +using Elastic.Clients.Elasticsearch; +using Elastic.Clients.Elasticsearch.Core.Bulk; +using Elastic.Clients.Elasticsearch.Esql; +using Elastic.Transport; + +var url = Environment.GetEnvironmentVariable("ES_URL") + ?? throw new InvalidOperationException("ES_URL is not set."); +var apiKey = Environment.GetEnvironmentVariable("ES_API_KEY") + ?? throw new InvalidOperationException("ES_API_KEY is not set."); + +var settings = new ElasticsearchClientSettings(new Uri(url)) + .Authentication(new ApiKey(apiKey)); +var es = new ElasticsearchClient(settings); +``` + +:::: + +::::{tab-item} Java +:sync: java + +```java +package quickstart; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.StringReader; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.Refresh; +import co.elastic.clients.elasticsearch.core.BulkRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.elasticsearch.esql.EsqlFormat; +import co.elastic.clients.transport.endpoints.BinaryResponse; + +public class App { + public static void main(String[] args) throws Exception { + String serverUrl = System.getenv("ES_URL"); + String apiKey = System.getenv("ES_API_KEY"); + + ElasticsearchClient es = ElasticsearchClient.of(b -> b + .host(serverUrl) + .apiKey(apiKey) + ); + } +} +``` + +:::: + +::::{tab-item} Go +:sync: go + +```go +package main + +import ( + "log" + "os" + + "github.com/elastic/go-elasticsearch/v9" +) + +func main() { + es, err := elasticsearch.New( + elasticsearch.WithAddresses(os.Getenv("ES_URL")), + elasticsearch.WithAPIKey(os.Getenv("ES_API_KEY")), + ) + if err != nil { + log.Fatal(err) + } +} +``` + +:::: + +::::: + +## Verify your connection [connect-through-an-sdk-verify] + +To verify your connection, create an index, index some sample data, and check the document count. + +1. Create an index called `books`: + +:::::{tab-set} +:group: languages + +::::{tab-item} Python +:sync: python + +```python +es.indices.create( + index="books", + mappings={ + "properties": { + "description": { + "type": "semantic_text", + } + } + }, +) +``` + +:::: + +::::{tab-item} TypeScript +:sync: typescript + +```typescript +await es.indices.create({ + index: "books", + mappings: { + properties: { + description: { + type: "semantic_text", + }, + }, + }, +}); +``` + +:::: + +::::{tab-item} PHP +:sync: php + +```php +$es->indices()->create([ + "index" => "books", + "body" => [ + "mappings" => [ + "properties" => [ + "description" => [ + "type" => "semantic_text", + ], + ], + ], + ], +]); +``` + +:::: + +::::{tab-item} Ruby +:sync: ruby + +```ruby +es.indices.create( + index: "books", + body: { + mappings: { + properties: { + description: { + type: "semantic_text" + } + } + } + } +) +``` + +:::: + +::::{tab-item} C#/.NET +:sync: csharp + +```csharp +await es.Indices.CreateAsync("books", c => c + .Mappings(m => m + .Properties(p => p + .SemanticText(b => b.Description) + ) + ) +); +``` + +:::: + +::::{tab-item} Java +:sync: java + +```java +es.indices().create(c -> c + .index("books") + .withJson(new StringReader(""" + { + "mappings": { + "properties": { + "description": { + "type": "semantic_text" + } + } + } + } + """)) +); +``` + +:::: + +::::{tab-item} Go +:sync: go + +```go +createResponse, err := es.Indices.Create( + "books", + es.Indices.Create.WithBody(strings.NewReader(`{ + "mappings": { + "properties": { + "description": { + "type": "semantic_text" + } + } + } + }`)), +) +if err != nil { + panic(err) +} +if createResponse.IsError() { + log.Fatal(createResponse) +} +createResponse.Body.Close() +``` + +:::: +::::: + +2. Index five sample books in one bulk request: + +:::::{tab-set} +:group: languages + +::::{tab-item} Python +:sync: python + +```python +books = [ + {"title": "The Left Hand of Darkness", "author": "Ursula K. Le Guin", "release_year": 1969, + "description": "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap."}, + {"title": "Project Hail Mary", "author": "Andy Weir", "release_year": 2021, + "description": "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth."}, + {"title": "The Name of the Wind", "author": "Patrick Rothfuss", "release_year": 2007, + "description": "A gifted young musician and magician tells the story of his rise from orphan to legend."}, + {"title": "Klara and the Sun", "author": "Kazuo Ishiguro", "release_year": 2021, + "description": "An artificial friend watches human love and loneliness while hoping a child will pick her."}, + {"title": "Dune", "author": "Frank Herbert", "release_year": 1965, + "description": "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power."}, +] + +helpers.bulk(es, ({"_index": "books", "_source": b} for b in books), refresh="wait_for") +``` + +:::: + +::::{tab-item} TypeScript +:sync: typescript + +```typescript +const books = [ + { + title: "The Left Hand of Darkness", + author: "Ursula K. Le Guin", + release_year: 1969, + description: "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap.", + }, + { + title: "Project Hail Mary", + author: "Andy Weir", + release_year: 2021, + description: "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth.", + }, + { + title: "The Name of the Wind", + author: "Patrick Rothfuss", + release_year: 2007, + description: "A gifted young musician and magician tells the story of his rise from orphan to legend.", + }, + { + title: "Klara and the Sun", + author: "Kazuo Ishiguro", + release_year: 2021, + description: "An artificial friend watches human love and loneliness while hoping a child will pick her.", + }, + { + title: "Dune", + author: "Frank Herbert", + release_year: 1965, + description: "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power.", + }, +]; + +await es.bulk({ + refresh: "wait_for", + operations: books.flatMap((book) => [ + { index: { _index: "books" } }, + book, + ]), +}); +``` + +:::: + +::::{tab-item} PHP +:sync: php + +```php +$books = [ + [ + "title" => "The Left Hand of Darkness", + "author" => "Ursula K. Le Guin", + "release_year" => 1969, + "description" => "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap.", + ], + [ + "title" => "Project Hail Mary", + "author" => "Andy Weir", + "release_year" => 2021, + "description" => "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth.", + ], + [ + "title" => "The Name of the Wind", + "author" => "Patrick Rothfuss", + "release_year" => 2007, + "description" => "A gifted young musician and magician tells the story of his rise from orphan to legend.", + ], + [ + "title" => "Klara and the Sun", + "author" => "Kazuo Ishiguro", + "release_year" => 2021, + "description" => "An artificial friend watches human love and loneliness while hoping a child will pick her.", + ], + [ + "title" => "Dune", + "author" => "Frank Herbert", + "release_year" => 1965, + "description" => "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power.", + ], +]; + +$operations = []; +foreach ($books as $book) { + $operations[] = [ + "index" => [ + "_index" => "books", + ], + ]; + $operations[] = $book; +} + +$es->bulk([ + "refresh" => "wait_for", + "body" => $operations, +]); +``` + +:::: + +::::{tab-item} Ruby +:sync: ruby + +```ruby +books = [ + { + title: "The Left Hand of Darkness", + author: "Ursula K. Le Guin", + release_year: 1969, + description: "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap." + }, + { + title: "Project Hail Mary", + author: "Andy Weir", + release_year: 2021, + description: "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth." + }, + { + title: "The Name of the Wind", + author: "Patrick Rothfuss", + release_year: 2007, + description: "A gifted young musician and magician tells the story of his rise from orphan to legend." + }, + { + title: "Klara and the Sun", + author: "Kazuo Ishiguro", + release_year: 2021, + description: "An artificial friend watches human love and loneliness while hoping a child will pick her." + }, + { + title: "Dune", + author: "Frank Herbert", + release_year: 1965, + description: "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power." + } +] + +operations = books.flat_map do |book| + [ + { index: { _index: "books" } }, + book + ] +end + +es.bulk( + body: operations, + refresh: "wait_for" +) +``` + +:::: + +::::{tab-item} C#/.NET +:sync: csharp + +```csharp +var books = new[] +{ + new Book( + "The Left Hand of Darkness", + "Ursula K. Le Guin", + 1969, + "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap." + ), + new Book( + "Project Hail Mary", + "Andy Weir", + 2021, + "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth." + ), + new Book( + "The Name of the Wind", + "Patrick Rothfuss", + 2007, + "A gifted young musician and magician tells the story of his rise from orphan to legend." + ), + new Book( + "Klara and the Sun", + "Kazuo Ishiguro", + 2021, + "An artificial friend watches human love and loneliness while hoping a child will pick her." + ), + new Book( + "Dune", + "Frank Herbert", + 1965, + "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power." + ) +}; + +var operations = new BulkOperationsCollection(); +foreach (var book in books) +{ + operations.Add(new BulkIndexOperation(book) + { + Index = "books" + }); +} + +await es.BulkAsync(new BulkRequest +{ + Refresh = Refresh.WaitFor, + Operations = operations +}); + +public record Book( + string Title, + string Author, + [property: JsonPropertyName("release_year")] int ReleaseYear, + string Description +); +``` + +:::: + +::::{tab-item} Java +:sync: java + +```java +record Book( + String title, + String author, + int release_year, + String description +) {} + +Book[] books = { + new Book( + "The Left Hand of Darkness", + "Ursula K. Le Guin", + 1969, + "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap." + ), + new Book( + "Project Hail Mary", + "Andy Weir", + 2021, + "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth." + ), + new Book( + "The Name of the Wind", + "Patrick Rothfuss", + 2007, + "A gifted young musician and magician tells the story of his rise from orphan to legend." + ), + new Book( + "Klara and the Sun", + "Kazuo Ishiguro", + 2021, + "An artificial friend watches human love and loneliness while hoping a child will pick her." + ), + new Book( + "Dune", + "Frank Herbert", + 1965, + "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power." + ) +}; + +BulkRequest.Builder bulk = new BulkRequest.Builder() + .refresh(Refresh.WaitFor); + +for (Book book : books) { + bulk.operations(op -> op + .index(idx -> idx + .index("books") + .document(book) + ) + ); +} + +es.bulk(bulk.build()); +``` + +:::: + +::::{tab-item} Go +:sync: go + +```go +type Book struct { + Title string `json:"title"` + Author string `json:"author"` + ReleaseYear int `json:"release_year"` + Description string `json:"description"` +} + +books := []Book{ + { + Title: "The Left Hand of Darkness", + Author: "Ursula K. Le Guin", + ReleaseYear: 1969, + Description: "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap.", + }, + { + Title: "Project Hail Mary", + Author: "Andy Weir", + ReleaseYear: 2021, + Description: "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth.", + }, + { + Title: "The Name of the Wind", + Author: "Patrick Rothfuss", + ReleaseYear: 2007, + Description: "A gifted young musician and magician tells the story of his rise from orphan to legend.", + }, + { + Title: "Klara and the Sun", + Author: "Kazuo Ishiguro", + ReleaseYear: 2021, + Description: "An artificial friend watches human love and loneliness while hoping a child will pick her.", + }, + { + Title: "Dune", + Author: "Frank Herbert", + ReleaseYear: 1965, + Description: "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power.", + }, +} + +indexer, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{ + Client: es, + Index: "books", + Refresh: "wait_for", +}) +if err != nil { + panic(err) +} + +ctx := context.Background() +for _, book := range books { + data, err := json.Marshal(book) + if err != nil { + panic(err) + } + + err = indexer.Add(ctx, esutil.BulkIndexerItem{ + Action: "index", + Body: bytes.NewReader(data), + }) + if err != nil { + panic(err) + } +} + +if err := indexer.Close(ctx); err != nil { + panic(err) +} +``` + +::::: + +3. Verify the documents were indexed: + +:::::{tab-set} +:group: languages + +::::{tab-item} Python +:sync: python + +```python +es.count(index="books") +``` + +:::: + +::::{tab-item} TypeScript +:sync: typescript + +```typescript +await es.count({ index: "books" }); +``` + +:::: + +::::{tab-item} PHP +:sync: php + +```php +$es->count([ + "index" => "books", +]); +``` + +:::: + +::::{tab-item} Ruby +:sync: ruby + +```ruby +es.count(index: "books") +``` + +:::: + +::::{tab-item} C#/.NET +:sync: csharp + +```csharp +await es.CountAsync(c => c.Indices("books")); +``` + +:::: + +::::{tab-item} Java +:sync: java + +```java +es.count(c -> c.index("books")); +``` + +:::: + +::::{tab-item} Go +:sync: go + +```go +countRes, err := es.Count(es.Count.WithIndex("books")) +if err != nil { + log.Fatal(err) +} +countRes.Body.Close() +``` + +:::: + +::::: + +The response returns a count of 5, which confirms that all five books were indexed. + +## Next steps [connect-through-an-sdk-next] + +{{es}} is up and running, and you have already indexed a small sample dataset. Next, learn how to ingest your own data at scale in [](/solutions/search/ingest-for-search.md). From 37203edb8da740e32055503746190cd39e312902 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Wed, 7 Oct 2026 15:00:38 +0200 Subject: [PATCH 04/48] Resolves merge conflict --- solutions/search/set-up/connect-through-an-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index 77f975b5a7d..9027e470dba 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -13,7 +13,7 @@ Install and configure an official {{es}} language client to connect to a project ## Connect to your project [connect-through-an-sdk-connect] -Set the project endpoint and API key as environment variables: +To get your {{es}} endpoint and API key, refer to [API key and endpoints](/solutions/search/set-up/api-key-and-endpoints.md). Set them as environment variables: :::::{tab-set} :group: operating-systems From 8aefe4538089b46dff9928736f04fdaa96cab871 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Thu, 8 Oct 2026 13:24:19 +0200 Subject: [PATCH 05/48] Addressing feedback --- .../find-endpoint-serverless-console.md | 12 ----- .../_snippets/create-an-api-key.md | 2 + .../_snippets/deployment-tab-legend.md | 13 +++++ .../_snippets/find-elasticsearch-endpoint.md | 14 +++++- .../search-connection-details.md | 13 ++--- .../search/set-up/api-key-and-endpoints.md | 17 ++++--- .../search/set-up/choose-a-deployment-type.md | 47 +++++++++++-------- .../search/set-up/connect-through-an-sdk.md | 24 ++++++++-- 8 files changed, 91 insertions(+), 51 deletions(-) delete mode 100644 deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md create mode 100644 solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md diff --git a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md deleted file mode 100644 index dca38f994d3..00000000000 --- a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md +++ /dev/null @@ -1,12 +0,0 @@ -1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. -2. Find your project and select **Manage**. -3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. -4. Copy the **Endpoint** value. - - :::{image} /solutions/images/cloud-console-serverless-endpoint.png - :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons - :screenshot: - :width: 50% - ::: - -If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index 8b646d19a02..288520e4f5f 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -28,3 +28,5 @@ Keys created here don't expire unless you add an expiration date. :::: ::::: + +For key types, privileges, and expiration options, refer to [](/deploy-manage/api-keys.md). diff --git a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md new file mode 100644 index 00000000000..008d2158d35 --- /dev/null +++ b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md @@ -0,0 +1,13 @@ + + +The deployment tabs mean the following: + +* **Self-managed**: a cluster you install and manage. +* **ECE**: {{ece}}. +* **ECK**: {{eck}}. +* **ECH**: {{ech}}. +* **Serverless**: an {{es}} {{vectordb}} project or an {{es}} project. diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 101698c4d64..03b54a86350 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -9,8 +9,18 @@ This snippet is in use in the following locations: ::::{applies-item} serverless: ga Your endpoint details are on your project's page in the {{ecloud}} Console. -:::{include} /deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md -::: +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. +2. Find your project and select **Manage**. +3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. +4. Copy the **Endpoint** value. + + :::{image} /solutions/images/cloud-console-serverless-endpoint.png + :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons + :screenshot: + :width: 50% + ::: + +If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). :::{tip} You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. diff --git a/solutions/elasticsearch-solution-project/search-connection-details.md b/solutions/elasticsearch-solution-project/search-connection-details.md index e8fd017400a..fb2764c5885 100644 --- a/solutions/elasticsearch-solution-project/search-connection-details.md +++ b/solutions/elasticsearch-solution-project/search-connection-details.md @@ -22,8 +22,11 @@ To create an API key, you need the `manage_api_key` or the `manage_own_api_key` ## Find your {{es}} endpoint [find-endpoint-cloud-self-managed] -::::{include} _snippets/find-elasticsearch-endpoint.md -:::: +:::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md +::: + +:::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +::: ### Find your Cloud ID [find-cloud-id-cloud-self-managed] @@ -53,10 +56,8 @@ To skip {{kib}}, select **Hosted** in the {{ecloud}} Console, open your deployme ## Create an API key [create-an-api-key-cloud-self-managed] -::::{include} _snippets/create-an-api-key.md -:::: - -For key types, privileges, and expiration options, refer to [](/deploy-manage/api-keys.md). +:::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +::: ## Test your connection [elasticsearch-get-started-test-connection] diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index 38cb00662c6..fadb961627f 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -11,19 +11,22 @@ type: how-to To connect a client to {{es}} for search, you need the endpoint URL and an API key. The steps depend on where your deployment runs. +:::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md +::: + ## Find your {{es}} endpoint [find-your-elasticsearch-endpoint] -::::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md -:::: +:::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +::: -## Create an API key [create-an-api-key] +## Get your API key [get-your-api-key] -To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. +If you just created an {{es}} {{vectordb}} project or an {{es}} project, a generated API key is on the **Getting started** {icon}`rocket` page. -::::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md -:::: +Otherwise, create an API key: -For key types, privileges, and expiration options, refer to [](/deploy-manage/api-keys.md). +:::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +::: ## Next step [api-key-and-endpoints-next] diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 867792a2429..c9e5b39fcdd 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -3,41 +3,48 @@ applies_to: stack: serverless: navigation_title: Choose a deployment type -description: Select an Elasticsearch hosting model for search, compare Serverless project types, and start a deployment. +description: Select an Elasticsearch deployment model for search, compare Serverless project types, and start a deployment. type: overview --- # Choose a deployment type [choose-a-deployment-type] -{{es}} runs on several deployment types, and each type fits different operational needs. +{{es}} runs on several deployment types, and each type fits different operational needs. The type you select sets who operates the cluster, how usage is billed, and which {{kib}} search tools you can use. This page helps you select the deployment type that fits your needs. -The type you select sets who operates the cluster, how usage is billed, and which {{kib}} search tools you can use. This page helps you select the deployment type that fits your needs. +:::::{stepper} -:::{note} -For most search workloads using vectors, the recommended option is an [{{es}} {{vectordb}} project](/solutions/vector-database.md). Click here to get started with the {{vectordb}}. For a detailed comparison, use the resources in [Select a hosting model](#select-a-hosting-model). -::: +::::{step} Select a deployment model + +Elastic supports the following deployment types for search: self-managed, {{ece}} (ECE), {{eck}} (ECK), {{ech}} (ECH), and {{serverless-short}} (an {{es}} {{vectordb}} project or an {{es}} project). -## Select a hosting model [select-a-hosting-model] +1. Use the [](/deploy-manage/deploy/deployment-comparison.md) to learn how security, cluster management, monitoring, and data lifecycle differ. Choose the one that best fits your needs. -{{es}} supports these deployment types for search: [{{serverless-short}}](/deploy-manage/deploy/elastic-cloud/serverless.md) (an [{{es}} {{vectordb}} project](/solutions/vector-database.md) or an [{{es}} project](/solutions/elasticsearch-solution-project.md)), [{{ech}}](/deploy-manage/deploy/elastic-cloud/cloud-hosted.md), and [self-managed](/deploy-manage/deploy/self-managed.md). Each hosting model affects who manages the cluster and how it is billed. +2. If you go with {{serverless-short}}, compare {{es-serverless}} and {{es}} {{vectordb}}: -Use the following resources to compare hosting models: +:::{include} _snippets/serverless-project-type-comparison.md +::: -1. Compare deployment options, including self-managed, {{ech}}, and {{serverless-short}}. Refer to [](/deploy-manage/deploy/deployment-comparison.md). -2. Compare {{es-serverless}} and {{es}} {{vectordb}}: +:::{tip} +For most search workloads using vectors, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Start your {{es}} {{vectordb}} project](https://cloud.elastic.co/registration?onboarding_token=vector). +::: - :::{include} _snippets/serverless-project-type-comparison.md - ::: +:::: -## Start a deployment [start-a-deployment] +::::{step} Start a deployment -After you have selected a deployment type, start with one of these guides: +After you have selected a deployment type, use the following guides to start a deployment: -* {{es}} {{vectordb}} project: [](/solutions/vector-database/get-started.md) -* {{es}} project ({{serverless-short}}): [](/solutions/elasticsearch-solution-project/get-started.md) -* {{ech}}: [](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md) -* Self-managed: [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) +* [](/solutions/vector-database/get-started.md) +* [](/solutions/elasticsearch-solution-project/get-started.md) +* [](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md) +* [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) -## Next step [choose-a-deployment-type-next] +:::: + +::::{step} Next step After you have selected and started a deployment, get connected: find your endpoint and create an API key in [](/solutions/search/set-up/api-key-and-endpoints.md). + +:::: + +::::: diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index 9027e470dba..17b8a0c6812 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -11,7 +11,10 @@ type: how-to Install and configure an official {{es}} language client to connect to a project or cluster. -## Connect to your project [connect-through-an-sdk-connect] +:::::::{stepper} + +::::::{step} Connect to your project +:anchor: connect-through-an-sdk-connect To get your {{es}} endpoint and API key, refer to [API key and endpoints](/solutions/search/set-up/api-key-and-endpoints.md). Set them as environment variables: @@ -44,7 +47,10 @@ $Env:ES_API_KEY = "YOUR_API_KEY" ::::: -## Install and initialize a client [connect-through-an-sdk-install] +:::::: + +::::::{step} Install and initialize a client +:anchor: connect-through-an-sdk-install Install the client for your language. For a list of available clients, refer to [{{es}} clients](/reference/elasticsearch-clients/index.md). @@ -290,7 +296,10 @@ func main() { ::::: -## Verify your connection [connect-through-an-sdk-verify] +:::::: + +::::::{step} Verify your connection +:anchor: connect-through-an-sdk-verify To verify your connection, create an index, index some sample data, and check the document count. @@ -900,6 +909,13 @@ countRes.Body.Close() The response returns a count of 5, which confirms that all five books were indexed. -## Next steps [connect-through-an-sdk-next] +:::::: + +::::::{step} Next steps +:anchor: connect-through-an-sdk-next {{es}} is up and running, and you have already indexed a small sample dataset. Next, learn how to ingest your own data at scale in [](/solutions/search/ingest-for-search.md). + +:::::: + +::::::: From 203638d1191491fd0fa821ce52b3eeb07c43fcbb Mon Sep 17 00:00:00 2001 From: kosabogi Date: Thu, 8 Oct 2026 13:31:49 +0200 Subject: [PATCH 06/48] Fixes anchors --- .../_snippets/find-endpoint-serverless-console.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md diff --git a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md new file mode 100644 index 00000000000..dca38f994d3 --- /dev/null +++ b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md @@ -0,0 +1,12 @@ +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. +2. Find your project and select **Manage**. +3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. +4. Copy the **Endpoint** value. + + :::{image} /solutions/images/cloud-console-serverless-endpoint.png + :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons + :screenshot: + :width: 50% + ::: + +If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). From e81c0633244e1cbe8d07fb8aa0b4a8bd7134313c Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:16:02 +0200 Subject: [PATCH 07/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index c9e5b39fcdd..d78ab030e24 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -15,7 +15,7 @@ type: overview ::::{step} Select a deployment model -Elastic supports the following deployment types for search: self-managed, {{ece}} (ECE), {{eck}} (ECK), {{ech}} (ECH), and {{serverless-short}} (an {{es}} {{vectordb}} project or an {{es}} project). +You can choose from several deployment options for your search use cases with Elastic, including self-managed deployments, {{ech}}, and {{serverless-short}} projects. 1. Use the [](/deploy-manage/deploy/deployment-comparison.md) to learn how security, cluster management, monitoring, and data lifecycle differ. Choose the one that best fits your needs. From 144cad3dc0570cc58e4ca191c8352a4b5b4126f8 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:18:44 +0200 Subject: [PATCH 08/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index d78ab030e24..70e6efed1ae 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -9,7 +9,7 @@ type: overview # Choose a deployment type [choose-a-deployment-type] -{{es}} runs on several deployment types, and each type fits different operational needs. The type you select sets who operates the cluster, how usage is billed, and which {{kib}} search tools you can use. This page helps you select the deployment type that fits your needs. +{{es}} is at the core of every Elastic deployment type. The deployment type you choose determines who manages the infrastructure, how usage is billed, and which {{kib}} search tools are available. Use this page to compare the options and find the best fit for your operational needs. :::::{stepper} From 6ae4d0c437d972ebb9f33220e274b9aac70de636 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:19:07 +0200 Subject: [PATCH 09/48] Update solutions/search/set-up.md Co-authored-by: Liam Thompson --- solutions/search/set-up.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 57adc2338ed..c47bdff7664 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -9,7 +9,7 @@ type: overview # Set up Elasticsearch for search [set-up-elasticsearch-for-search] -This section covers where {{es}} runs for a search application and how you connect to it. Refer to the following pages to set up your {{es}} deployment: +This section covers where {{es}} runs and how you connect to it. Refer to the following pages to set up your {{es}} deployment: * [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types and select one for your search workload. * [](/solutions/search/set-up/api-key-and-endpoints.md): Find the {{es}} endpoint and create an API key for search. From d35b3cb25205b375353e077e65b814bb665dfcf2 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:22:27 +0200 Subject: [PATCH 10/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 70e6efed1ae..21080ab09bd 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -25,7 +25,7 @@ You can choose from several deployment options for your search use cases with El ::: :::{tip} -For most search workloads using vectors, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Start your {{es}} {{vectordb}} project](https://cloud.elastic.co/registration?onboarding_token=vector). +For most search workloads using vectors, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Sign up for a free trial](https://cloud.elastic.co/registration?onboarding_token=vector). ::: :::: From b8dd1eb4102c459d043af8ab8dc6b834e7c2ef5a Mon Sep 17 00:00:00 2001 From: kosabogi Date: Mon, 12 Oct 2026 10:55:41 +0200 Subject: [PATCH 11/48] Addresses feedback --- .../find-endpoint-serverless-console.md | 2 +- error-start-local.log | 11 -------- .../_snippets/find-elasticsearch-endpoint.md | 2 +- solutions/search/set-up.md | 2 +- .../search/set-up/api-key-and-endpoints.md | 2 +- .../search/set-up/choose-a-deployment-type.md | 27 ++++++++++++------- 6 files changed, 22 insertions(+), 24 deletions(-) delete mode 100644 error-start-local.log diff --git a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md index dca38f994d3..d9f32c1b7a8 100644 --- a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md +++ b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md @@ -9,4 +9,4 @@ :width: 50% ::: -If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). +If your project runs on AWS and AWS PrivateLink is set up, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). diff --git a/error-start-local.log b/error-start-local.log deleted file mode 100644 index 5145235acad..00000000000 --- a/error-start-local.log +++ /dev/null @@ -1,11 +0,0 @@ -Error: docker compose up --wait command failed! -Start-local version: 0.14.0 -Docker engine: Docker version 29.8.2, build 7fc2dff -Docker compose: 5.5.1 -Elastic Stack version: 9.5.5 -Distribution: macOS -Version: 26.6.2 --- Logs of service es-local-dev: -Created elasticsearch keystore in /usr/share/elasticsearch/config/elasticsearch.keystore --- Logs of service kibana-local-dev: --- Logs of service kibana-local-settings: diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 03b54a86350..e5b631e0d02 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -20,7 +20,7 @@ Your endpoint details are on your project's page in the {{ecloud}} Console. :width: 50% ::: -If your project runs on AWS, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). +If your project runs on AWS and AWS PrivateLink is set up, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). :::{tip} You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index c47bdff7664..40ee635e2c7 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -11,6 +11,6 @@ type: overview This section covers where {{es}} runs and how you connect to it. Refer to the following pages to set up your {{es}} deployment: -* [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types and select one for your search workload. +* [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types, start one, and try a search quickstart. * [](/solutions/search/set-up/api-key-and-endpoints.md): Find the {{es}} endpoint and create an API key for search. * [](/solutions/search/set-up/connect-through-an-sdk.md): Install an official language client and connect it to your deployment. diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index fadb961627f..5fed2969b91 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -9,7 +9,7 @@ type: how-to # Get your API key and endpoints [get-your-api-key-and-endpoints] -To connect a client to {{es}} for search, you need the endpoint URL and an API key. The steps depend on where your deployment runs. +Find the endpoint URL and an API key. You need them to connect a client to {{es}} for search. The steps depend on where your deployment runs. :::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md ::: diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 21080ab09bd..ed3bd89f4ca 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -3,7 +3,7 @@ applies_to: stack: serverless: navigation_title: Choose a deployment type -description: Select an Elasticsearch deployment model for search, compare Serverless project types, and start a deployment. +description: Select an Elasticsearch deployment model for search, get it running, and try a search quickstart. type: overview --- @@ -13,13 +13,13 @@ type: overview :::::{stepper} -::::{step} Select a deployment model +::::{step} Choose a deployment and get {{es}} running You can choose from several deployment options for your search use cases with Elastic, including self-managed deployments, {{ech}}, and {{serverless-short}} projects. 1. Use the [](/deploy-manage/deploy/deployment-comparison.md) to learn how security, cluster management, monitoring, and data lifecycle differ. Choose the one that best fits your needs. -2. If you go with {{serverless-short}}, compare {{es-serverless}} and {{es}} {{vectordb}}: +2. If you go with {{serverless-short}}, compare {{es-serverless}} and {{es}} {{vectordb}} by use case: :::{include} _snippets/serverless-project-type-comparison.md ::: @@ -28,16 +28,25 @@ You can choose from several deployment options for your search use cases with El For most search workloads using vectors, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Sign up for a free trial](https://cloud.elastic.co/registration?onboarding_token=vector). ::: +After you select a type, use the matching guide to get {{es}} running: + +* {{serverless-short}}: + * [{{es}} {{vectordb}}](/solutions/vector-database/get-started.md) + * [{{es}} project](/solutions/elasticsearch-solution-project/get-started.md) +* [Self-managed](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) +* [{{ece}}](/deploy-manage/deploy/cloud-enterprise/create-deployment.md) +* [{{eck}}](/deploy-manage/deploy/cloud-on-k8s.md#eck-quickstart) +* [{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md) + :::: -::::{step} Start a deployment +::::{step} Try a quickstart -After you have selected a deployment type, use the following guides to start a deployment: +These quickstarts show how to use {{es}} for search. They work on any deployment type: -* [](/solutions/vector-database/get-started.md) -* [](/solutions/elasticsearch-solution-project/get-started.md) -* [](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md) -* [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) +* [](/solutions/search/get-started/index-basics.md): create an index, add documents, and run a search +* [](/solutions/search/get-started/keyword-search-python.md): build a search query with Python +* [](/solutions/search/get-started/semantic-search.md): run a semantic search with the `semantic_text` field type :::: From a603afd2329c9795c2d0b7c6ee2bf681bebaff18 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Wed, 14 Oct 2026 10:23:29 +0200 Subject: [PATCH 12/48] Addressing feedback --- .../_snippets/create-an-api-key.md | 37 ++++++++- .../_snippets/deployment-tab-legend.md | 6 +- .../_snippets/find-elasticsearch-endpoint.md | 82 ++++++++++++++----- solutions/search/set-up.md | 6 +- .../serverless-project-type-comparison.md | 10 --- .../search/set-up/api-key-and-endpoints.md | 19 ++++- .../search/set-up/choose-a-deployment-type.md | 13 +-- 7 files changed, 120 insertions(+), 53 deletions(-) delete mode 100644 solutions/search/set-up/_snippets/serverless-project-type-comparison.md diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index 288520e4f5f..8bd4ac3901a 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -6,7 +6,7 @@ This snippet is in use in the following locations: :::::{applies-switch} -::::{applies-item} { "deployment": { "ech": "ga", "ece": "ga" }, "serverless": "ga" } +::::{applies-item} serverless: ga 1. Open {{kib}} for your deployment or project. 2. From the **Help menu** {icon}`question`, select **Connection details**. @@ -18,7 +18,40 @@ This snippet is in use in the following locations: Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. :::: -::::{applies-item} {"deployment": {"eck": "ga", "self": "ga"}} +::::{applies-item} ech: ga + +1. Open {{kib}} for your deployment or project. +2. From the **Help menu** {icon}`question`, select **Connection details**. +3. Select the **API key** tab. +4. In the **API key name** field, enter a name, then select **Create API key**. +5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. +6. Copy the key. It isn't available after you close the panel. + +Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. +:::: + +::::{applies-item} ece: ga + +1. Open {{kib}} for your deployment or project. +2. From the **Help menu** {icon}`question`, select **Connection details**. +3. Select the **API key** tab. +4. In the **API key name** field, enter a name, then select **Create API key**. +5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. +6. Copy the key. It isn't available after you close the panel. + +Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. +:::: + +::::{applies-item} {"deployment": {"self": "ga"}} +1. Go to the **API keys** management page, using the [global search field](/explore-analyze/find-and-organize/find-apps-and-objects.md) to find it. +2. Select **Create API key**. +3. Enter a name, then select **Create API key**. +4. Copy the key. It isn't available after you leave the page. + +Keys created here don't expire unless you add an expiration date. +:::: + +::::{applies-item} {"deployment": {"eck": "ga"}} 1. Go to the **API keys** management page, using the [global search field](/explore-analyze/find-and-organize/find-apps-and-objects.md) to find it. 2. Select **Create API key**. 3. Enter a name, then select **Create API key**. diff --git a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md index 008d2158d35..fc10d44b2e2 100644 --- a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md +++ b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md @@ -6,8 +6,8 @@ This snippet is in use in the following locations: The deployment tabs mean the following: -* **Self-managed**: a cluster you install and manage. +* **Serverless**: an {{es}} {{vectordb}} project or an {{es}} project. +* **ECH**: {{ech}}. * **ECE**: {{ece}}. +* **Self-managed**: a cluster you install and manage. * **ECK**: {{eck}}. -* **ECH**: {{ech}}. -* **Serverless**: an {{es}} {{vectordb}} project or an {{es}} project. diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index e5b631e0d02..0b88bb56899 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -4,48 +4,86 @@ This snippet is in use in the following locations: - solutions/search/set-up/api-key-and-endpoints.md --> -:::::{applies-switch} +:::::::{applies-switch} -::::{applies-item} serverless: ga -Your endpoint details are on your project's page in the {{ecloud}} Console. +::::::{applies-item} serverless: ga +Copy the {{es}} endpoint from {{kib}} or the {{ecloud}} Console. + +:::::{tab-set} + +::::{tab-item} {{kib}} + +1. Open {{kib}} for your project. +2. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**. +3. On the **Endpoints** tab, copy the **{{es}} endpoint**. + +:::{image} /solutions/images/kibana-connection-details-endpoints.png +:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab +:screenshot: +:width: 50% +::: + +:::: + +::::{tab-item} {{ecloud}} Console 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. 2. Find your project and select **Manage**. 3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. 4. Copy the **Endpoint** value. - :::{image} /solutions/images/cloud-console-serverless-endpoint.png - :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons - :screenshot: - :width: 50% - ::: +:::{image} /solutions/images/cloud-console-serverless-endpoint.png +:alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons +:screenshot: +:width: 50% +::: If your project runs on AWS and AWS PrivateLink is set up, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). -:::{tip} -You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. +:::: + +::::: + +:::::: + +::::::{applies-item} ech: ga +Copy the {{es}} endpoint from {{kib}} or the {{ecloud}} Console. + +:::::{tab-set} + +::::{tab-item} {{kib}} + +1. Open {{kib}} for your deployment. +2. From the **Help menu** {icon}`question`, select **Connection details**. +3. On the **Endpoints** tab, copy the **{{es}} endpoint**. + +:::{image} /solutions/images/kibana-connection-details-endpoints.png +:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab +:screenshot: +:width: 50% ::: + :::: -::::{applies-item} ech: ga -Your endpoint details are on your deployment's page in the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body). +::::{tab-item} {{ecloud}} Console -1. In the {{ecloud}} Console, select **Hosted**. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Hosted**. 2. Select your deployment. 3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. 4. Copy the **Endpoint** value. - :::{image} /solutions/images/cloud-console-hosted-endpoint.png - :alt: The Elasticsearch panel on a hosted deployment page in the Elastic Cloud Console, showing the Endpoint value with a copy button - :screenshot: - :width: 50% - ::: - -:::{tip} -You can also find your endpoint details in {{kib}}. From the **Help menu** {icon}`question`, select **Connection details**, then copy the **{{es}} endpoint** from the **Endpoints** tab. +:::{image} /solutions/images/cloud-console-hosted-endpoint.png +:alt: The Elasticsearch panel on a hosted deployment page in the Elastic Cloud Console, showing the Endpoint value with a copy button +:screenshot: +:width: 50% ::: + :::: +::::: + +:::::: + ::::{applies-item} ece: ga Your endpoint details are in the **Connection details** panel in {{kib}}. @@ -89,4 +127,4 @@ kubectl get svc To reach the cluster from outside, expose the service and use its external address. Refer to [Access the endpoint](/deploy-manage/deploy/cloud-on-k8s/accessing-services.md#k8s-request-elasticsearch-endpoint) for both cases, including how to retrieve the certificate authority (CA) certificate. :::: -::::: +::::::: diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 40ee635e2c7..1673407aaf5 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -11,6 +11,6 @@ type: overview This section covers where {{es}} runs and how you connect to it. Refer to the following pages to set up your {{es}} deployment: -* [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types, start one, and try a search quickstart. -* [](/solutions/search/set-up/api-key-and-endpoints.md): Find the {{es}} endpoint and create an API key for search. -* [](/solutions/search/set-up/connect-through-an-sdk.md): Install an official language client and connect it to your deployment. +1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types, start one, and try a search quickstart. +2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find the {{es}} endpoint and create an API key for search. +3. [](/solutions/search/set-up/connect-through-an-sdk.md): Install an official language client and connect it to your deployment. diff --git a/solutions/search/set-up/_snippets/serverless-project-type-comparison.md b/solutions/search/set-up/_snippets/serverless-project-type-comparison.md deleted file mode 100644 index 1ada69f14f9..00000000000 --- a/solutions/search/set-up/_snippets/serverless-project-type-comparison.md +++ /dev/null @@ -1,10 +0,0 @@ - - -| Use case | Example | Recommended project type | -| --- | --- | --- | -| [RAG and question answering](/solutions/search/vector/vector-search-use-cases.md#rag-and-question-answering-on-your-own-data) | A support assistant that retrieves passages from your docs, wikis, and tickets to ground an LLM's answers, mixing natural-language questions with exact product names or ticket IDs | {{es}} {{vectordb}} | -| [Multimodal search](/solutions/search/vector/vector-search-use-cases.md#multimodal-search) | Searching a photo library, or a mixed catalog of video, audio, and text, using embeddings from a multimodal model | {{es}} {{vectordb}} | -| Log, event, or other time series search | Searching and analyzing application logs or metrics that are continuously written and queried by time range | {{es}} project | diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index 5fed2969b91..fc17ea84585 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -14,12 +14,18 @@ Find the endpoint URL and an API key. You need them to connect a client to {{es} :::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md ::: -## Find your {{es}} endpoint [find-your-elasticsearch-endpoint] +:::::::::{stepper} + +::::::::{step} Find your {{es}} endpoint +:anchor: find-your-elasticsearch-endpoint :::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md ::: -## Get your API key [get-your-api-key] +:::::::: + +::::::::{step} Get your API key +:anchor: get-your-api-key If you just created an {{es}} {{vectordb}} project or an {{es}} project, a generated API key is on the **Getting started** {icon}`rocket` page. @@ -28,6 +34,13 @@ Otherwise, create an API key: :::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md ::: -## Next step [api-key-and-endpoints-next] +:::::::: + +::::::::{step} Next step +:anchor: api-key-and-endpoints-next After you have an endpoint and an API key, connect a language client in [](/solutions/search/set-up/connect-through-an-sdk.md). + +:::::::: + +::::::::: diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index ed3bd89f4ca..9ac1aac41a7 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -15,18 +15,11 @@ type: overview ::::{step} Choose a deployment and get {{es}} running -You can choose from several deployment options for your search use cases with Elastic, including self-managed deployments, {{ech}}, and {{serverless-short}} projects. +- For most search workloads, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Sign up for a free trial](https://cloud.elastic.co/registration?onboarding_token=vector). -1. Use the [](/deploy-manage/deploy/deployment-comparison.md) to learn how security, cluster management, monitoring, and data lifecycle differ. Choose the one that best fits your needs. +- If you have logs, events, or other time series data, the recommended option is an {{es}} project. Use it for data that is written continuously and queried by time range, such as application logs or metrics. -2. If you go with {{serverless-short}}, compare {{es-serverless}} and {{es}} {{vectordb}} by use case: - -:::{include} _snippets/serverless-project-type-comparison.md -::: - -:::{tip} -For most search workloads using vectors, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Sign up for a free trial](https://cloud.elastic.co/registration?onboarding_token=vector). -::: +- You can also compare the other deployment types and choose the one that best fits your operational needs. The [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) shows how security, cluster management, monitoring, and data lifecycle differ. After you select a type, use the matching guide to get {{es}} running: From 1d6e023ee1b00c535dabc5eb49fa63499020f28f Mon Sep 17 00:00:00 2001 From: kosabogi Date: Fri, 16 Oct 2026 10:23:51 +0200 Subject: [PATCH 13/48] Addresses feedback and reworks the Choose a deployment and get ES running section --- .../search/set-up/choose-a-deployment-type.md | 31 +++++++++++-------- .../search/set-up/connect-through-an-sdk.md | 4 +++ .../vector-full-text-search.md | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 9ac1aac41a7..d2f0e2257d1 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -15,31 +15,36 @@ type: overview ::::{step} Choose a deployment and get {{es}} running -- For most search workloads, the recommended option is a {{serverless-short}} {{es}} {{vectordb}} project. [Sign up for a free trial](https://cloud.elastic.co/registration?onboarding_token=vector). +Select a deployment type below to get {{es}} running. -- If you have logs, events, or other time series data, the recommended option is an {{es}} project. Use it for data that is written continuously and queried by time range, such as application logs or metrics. +**Quick start options** -- You can also compare the other deployment types and choose the one that best fits your operational needs. The [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) shows how security, cluster management, monitoring, and data lifecycle differ. +* **[{{ecloud}}](/deploy-manage/deploy/elastic-cloud.md)**: Includes {{serverless-full}} and {{ech}}. Both run on {{ecloud}}, in the cloud provider and region of your choice. + * **[{{serverless-full}}](/deploy-manage/deploy/elastic-cloud/serverless.md)**: Includes the {{es}} {{vectordb}} project and the {{es}} project. Elastic scales and upgrades the project, so you can focus on your data: + * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads and uses a vector-tuned default configuration, with a hardware profile suited to embeddings. Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). + * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, this is the recommended option. Use it for data that is written continuously and queried by time range, such as telemetry data, application logs, or metrics. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). + * **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). +* **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. Refer to [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md). -After you select a type, use the matching guide to get {{es}} running: +**Advanced options** -* {{serverless-short}}: - * [{{es}} {{vectordb}}](/solutions/vector-database/get-started.md) - * [{{es}} project](/solutions/elasticsearch-solution-project/get-started.md) -* [Self-managed](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md) -* [{{ece}}](/deploy-manage/deploy/cloud-enterprise/create-deployment.md) -* [{{eck}}](/deploy-manage/deploy/cloud-on-k8s.md#eck-quickstart) -* [{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md) +* **[Self-managed](/deploy-manage/deploy/self-managed.md)**: Install, configure, and run Elastic on your own premises. +* **[{{ece}}](/deploy-manage/deploy/cloud-enterprise/create-deployment.md)**: Deploy {{ecloud}} on public or private clouds, virtual machines, or your own premises. +* **[{{eck}}](/deploy-manage/deploy/cloud-on-k8s.md#eck-quickstart)**: Deploy {{ecloud}} on Kubernetes. + +For a detailed comparison of all available deployment types, refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md). + +If {{es}} is running, try a quickstart tutorial to index data and run a search in a few minutes. :::: ::::{step} Try a quickstart -These quickstarts show how to use {{es}} for search. They work on any deployment type: +These quickstarts show how to use {{es}} for search: * [](/solutions/search/get-started/index-basics.md): create an index, add documents, and run a search +* [](/solutions/vector-database/vector-full-text-search.md): connect a client and run full-text, semantic, and hybrid search * [](/solutions/search/get-started/keyword-search-python.md): build a search query with Python -* [](/solutions/search/get-started/semantic-search.md): run a semantic search with the `semantic_text` field type :::: diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index 17b8a0c6812..b9ba128122b 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -11,6 +11,10 @@ type: how-to Install and configure an official {{es}} language client to connect to a project or cluster. +:::{note} +To try things out without installing a client, you can also work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +::: + :::::::{stepper} ::::::{step} Connect to your project diff --git a/solutions/vector-database/vector-full-text-search.md b/solutions/vector-database/vector-full-text-search.md index 6182fe57e3a..e611c55f199 100644 --- a/solutions/vector-database/vector-full-text-search.md +++ b/solutions/vector-database/vector-full-text-search.md @@ -17,7 +17,7 @@ Are you an agent? Use the [elasticsearch-onboarding skill](https://github.com/el ## Create a Vector Database project [vector-full-text-search-create-project] -Create a free [{{es}} Vector Database project](https://cloud.elastic.co/serverless-registration?onboarding_token=vector). It's serverless and built for search and vector workloads, so you don't need to size or manage a cluster. +Create a free [{{es}} Vector Database project](https://cloud.elastic.co/serverless-registration?onboarding_token=vector). It's serverless and built for search and vector workloads, so you don't need to size or manage a cluster. For other quick start options that don't use a Vector Database project, refer to [Quick start options](/get-started/deployment-options.md#quick-start-options). The project takes about a minute to start. The **Getting started** page then displays the **Project endpoint** and a generated API key. Copy both values. From 58d8669921b2476cfcf90a806206b90ad9913858 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Mon, 19 Oct 2026 10:33:09 +0200 Subject: [PATCH 14/48] Updates the Choose a deployment type section --- .../search/set-up/choose-a-deployment-type.md | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index d2f0e2257d1..9795a0a191b 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -15,24 +15,21 @@ type: overview ::::{step} Choose a deployment and get {{es}} running -Select a deployment type below to get {{es}} running. +Get {{es}} running in a few minutes. -**Quick start options** +**Try for free on {{ecloud}}** -* **[{{ecloud}}](/deploy-manage/deploy/elastic-cloud.md)**: Includes {{serverless-full}} and {{ech}}. Both run on {{ecloud}}, in the cloud provider and region of your choice. - * **[{{serverless-full}}](/deploy-manage/deploy/elastic-cloud/serverless.md)**: Includes the {{es}} {{vectordb}} project and the {{es}} project. Elastic scales and upgrades the project, so you can focus on your data: - * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads and uses a vector-tuned default configuration, with a hardware profile suited to embeddings. Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). - * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, this is the recommended option. Use it for data that is written continuously and queried by time range, such as telemetry data, application logs, or metrics. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). - * **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). -* **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. Refer to [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md). -**Advanced options** +* **[{{serverless-full}}](/deploy-manage/deploy/elastic-cloud/serverless.md)**: Elastic automatically scales and upgrades the project. + * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), [recommendations](/solutions/search/vector/vector-search-use-cases.md#discovery-and-recommendations), and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). + * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Use it for data that is written continuously and queried by time range, such as telemetry data, application logs, or metrics. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). +* **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). + +**Run locally** -* **[Self-managed](/deploy-manage/deploy/self-managed.md)**: Install, configure, and run Elastic on your own premises. -* **[{{ece}}](/deploy-manage/deploy/cloud-enterprise/create-deployment.md)**: Deploy {{ecloud}} on public or private clouds, virtual machines, or your own premises. -* **[{{eck}}](/deploy-manage/deploy/cloud-on-k8s.md#eck-quickstart)**: Deploy {{ecloud}} on Kubernetes. +* **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. Refer to [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md). -For a detailed comparison of all available deployment types, refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md). +Elastic also offers other deployment types. Refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) to learn about them in detail. If {{es}} is running, try a quickstart tutorial to index data and run a search in a few minutes. From fcd6fffd0e39660db1354f70bb5f17d669565994 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:12:08 +0200 Subject: [PATCH 15/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 9795a0a191b..0e8f4e02e31 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -9,7 +9,7 @@ type: overview # Choose a deployment type [choose-a-deployment-type] -{{es}} is at the core of every Elastic deployment type. The deployment type you choose determines who manages the infrastructure, how usage is billed, and which {{kib}} search tools are available. Use this page to compare the options and find the best fit for your operational needs. +{{es}} is at the core of every Elastic deployment type. The deployment type you choose determines who manages the infrastructure, scaling, and upgrades, and how usage is billed. Use this page to compare the options and find the best fit for your operational needs. :::::{stepper} From 23bc49131ad8656db261165cdb1964354716f67e Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:13:42 +0200 Subject: [PATCH 16/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 0e8f4e02e31..b4d5a415334 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -22,7 +22,7 @@ Get {{es}} running in a few minutes. * **[{{serverless-full}}](/deploy-manage/deploy/elastic-cloud/serverless.md)**: Elastic automatically scales and upgrades the project. * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), [recommendations](/solutions/search/vector/vector-search-use-cases.md#discovery-and-recommendations), and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). - * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Use it for data that is written continuously and queried by time range, such as telemetry data, application logs, or metrics. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). + * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). * **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). **Run locally** From d30c78b5ca5acaeffcb893be7bff51d94fae674b Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:14:03 +0200 Subject: [PATCH 17/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index b4d5a415334..0a2287432c8 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -29,7 +29,9 @@ Get {{es}} running in a few minutes. * **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. Refer to [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md). -Elastic also offers other deployment types. Refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) to learn about them in detail. +:::{tip} +Elastic also offers other deployment types. Refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) to learn more. +::: If {{es}} is running, try a quickstart tutorial to index data and run a search in a few minutes. From 297ed1f8c44cedea032ed4fc359722501d146b9b Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:14:49 +0200 Subject: [PATCH 18/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 0a2287432c8..73ac84057a1 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -33,13 +33,11 @@ Get {{es}} running in a few minutes. Elastic also offers other deployment types. Refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) to learn more. ::: -If {{es}} is running, try a quickstart tutorial to index data and run a search in a few minutes. - :::: ::::{step} Try a quickstart -These quickstarts show how to use {{es}} for search: +Once you have {{es}} running, try a quickstart tutorial: * [](/solutions/search/get-started/index-basics.md): create an index, add documents, and run a search * [](/solutions/vector-database/vector-full-text-search.md): connect a client and run full-text, semantic, and hybrid search From 46fd1baf28dcb97620c17051d7273731060a058c Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:17:47 +0200 Subject: [PATCH 19/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 73ac84057a1..1356de6f1b6 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -20,7 +20,7 @@ Get {{es}} running in a few minutes. **Try for free on {{ecloud}}** -* **[{{serverless-full}}](/deploy-manage/deploy/elastic-cloud/serverless.md)**: Elastic automatically scales and upgrades the project. +* **{{serverless-full}}**: Elastic automatically scales and upgrades the project. * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), [recommendations](/solutions/search/vector/vector-search-use-cases.md#discovery-and-recommendations), and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). * **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). From 58f3a35cf85694a451105da8d746bf20e29a738b Mon Sep 17 00:00:00 2001 From: kosabogi Date: Mon, 19 Oct 2026 11:27:21 +0200 Subject: [PATCH 20/48] Applies suggestions --- solutions/search/set-up/choose-a-deployment-type.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 1356de6f1b6..654e79ac8e4 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -17,15 +17,15 @@ type: overview Get {{es}} running in a few minutes. -**Try for free on {{ecloud}}** +### Try for free on {{ecloud}} -* **{{serverless-full}}**: Elastic automatically scales and upgrades the project. +* **{{serverless-full}}**: Elastic automatically scales and upgrades the project. Projects are versionless, so you always get the latest features. * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), [recommendations](/solutions/search/vector/vector-search-use-cases.md#discovery-and-recommendations), and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). -* **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). +* **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. The cluster runs a specific {{stack}} version. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). -**Run locally** +### Run locally * **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. Refer to [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md). From fb3995e197693d8cf82f46c77b7cee1b7887ffe2 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 19 Oct 2026 13:42:28 +0200 Subject: [PATCH 21/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: Liam Thompson --- solutions/search/set-up/choose-a-deployment-type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 654e79ac8e4..82a80238fac 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -27,7 +27,7 @@ Get {{es}} running in a few minutes. ### Run locally -* **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. Refer to [](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md). +* **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. :::{tip} Elastic also offers other deployment types. Refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) to learn more. From ba5f472110956262ac6c410830e31cf82a2e70a9 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Wed, 21 Oct 2026 10:43:34 +0200 Subject: [PATCH 22/48] Addressing feedback --- .../_snippets/create-an-api-key.md | 4 ++-- .../_snippets/deployment-tab-legend.md | 4 +++- .../_snippets/find-elasticsearch-endpoint.md | 12 ++++++------ solutions/search/set-up.md | 10 +++++----- .../search/set-up/api-key-and-endpoints.md | 17 ++++++++++++----- .../search/set-up/choose-a-deployment-type.md | 6 +++--- .../search/set-up/connect-through-an-sdk.md | 13 +++++++++++-- 7 files changed, 42 insertions(+), 24 deletions(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index 8bd4ac3901a..a208f9cc823 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -8,7 +8,7 @@ This snippet is in use in the following locations: ::::{applies-item} serverless: ga -1. Open {{kib}} for your deployment or project. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. 4. In the **API key name** field, enter a name, then select **Create API key**. @@ -20,7 +20,7 @@ Keys created here expire in 90 days and carry your own privileges. To set an exp ::::{applies-item} ech: ga -1. Open {{kib}} for your deployment or project. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your deployment and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. 4. In the **API key name** field, enter a name, then select **Create API key**. diff --git a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md index fc10d44b2e2..7f96ca6cd8b 100644 --- a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md +++ b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md @@ -4,10 +4,12 @@ This snippet is in use in the following locations: - solutions/search/set-up/api-key-and-endpoints.md --> -The deployment tabs mean the following: +:::{admonition} Deployment tabs +The deployment tabs below mean the following: * **Serverless**: an {{es}} {{vectordb}} project or an {{es}} project. * **ECH**: {{ech}}. * **ECE**: {{ece}}. * **Self-managed**: a cluster you install and manage. * **ECK**: {{eck}}. +::: diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 0b88bb56899..d2df2f1c97d 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -7,13 +7,13 @@ This snippet is in use in the following locations: :::::::{applies-switch} ::::::{applies-item} serverless: ga -Copy the {{es}} endpoint from {{kib}} or the {{ecloud}} Console. +Copy the {{es}} endpoint from the project UI or the {{ecloud}} Console. :::::{tab-set} -::::{tab-item} {{kib}} +::::{tab-item} Project UI -1. Open {{kib}} for your project. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Open**. 2. From the **Help menu** {icon}`question` or the project selector in the header, select **Connection details**. 3. On the **Endpoints** tab, copy the **{{es}} endpoint**. @@ -47,13 +47,13 @@ If your project runs on AWS and AWS PrivateLink is set up, the panel also lists :::::: ::::::{applies-item} ech: ga -Copy the {{es}} endpoint from {{kib}} or the {{ecloud}} Console. +Copy the {{es}} endpoint from the deployment UI or the {{ecloud}} Console. :::::{tab-set} -::::{tab-item} {{kib}} +::::{tab-item} Deployment UI -1. Open {{kib}} for your deployment. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your deployment and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. On the **Endpoints** tab, copy the **{{es}} endpoint**. diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 1673407aaf5..aeff5d2601b 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -7,10 +7,10 @@ description: Prepare Elasticsearch for search by selecting a deployment type, th type: overview --- -# Set up Elasticsearch for search [set-up-elasticsearch-for-search] +# Set up {{es}} for search [set-up-elasticsearch-for-search] -This section covers where {{es}} runs and how you connect to it. Refer to the following pages to set up your {{es}} deployment: +If you're building search on {{es}}, start here. These pages take you from selecting where to run {{es}} to sending your first request from code. -1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare deployment types, start one, and try a search quickstart. -2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find the {{es}} endpoint and create an API key for search. -3. [](/solutions/search/set-up/connect-through-an-sdk.md): Install an official language client and connect it to your deployment. +1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. +2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. +3. [](/solutions/search/set-up/connect-through-an-sdk.md): Install a language client and send a request from code. diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index fc17ea84585..dd6c56ebd76 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -9,7 +9,12 @@ type: how-to # Get your API key and endpoints [get-your-api-key-and-endpoints] -Find the endpoint URL and an API key. You need them to connect a client to {{es}} for search. The steps depend on where your deployment runs. +To connect a client to {{es}}, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type, including {{serverless-full}} projects, {{ech}}, {{ece}}, self-managed clusters, and {{eck}}. + +## Before you begin + +* Access to your deployment or project, such as an {{es}} {{vectordb}} project, an {{es}} project, or an {{ech}} deployment. +* To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. :::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md ::: @@ -19,17 +24,19 @@ Find the endpoint URL and an API key. You need them to connect a client to {{es} ::::::::{step} Find your {{es}} endpoint :anchor: find-your-elasticsearch-endpoint +The {{es}} endpoint is the URL your client uses to send requests. Where you find it depends on your deployment type. The following steps show you where to copy it. + :::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md ::: :::::::: -::::::::{step} Get your API key +::::::::{step} Create an API key :anchor: get-your-api-key -If you just created an {{es}} {{vectordb}} project or an {{es}} project, a generated API key is on the **Getting started** {icon}`rocket` page. - -Otherwise, create an API key: +:::{tip} +If you just created a {{serverless-short}} project, the **Getting started** {icon}`rocket` page shows a generated API key that you can copy immediately. If you have navigated away from that page, create a new API key as described below. +::: :::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md ::: diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 654e79ac8e4..ac82c8c723b 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -39,9 +39,9 @@ Elastic also offers other deployment types. Refer to the [deployment comparison] Once you have {{es}} running, try a quickstart tutorial: -* [](/solutions/search/get-started/index-basics.md): create an index, add documents, and run a search -* [](/solutions/vector-database/vector-full-text-search.md): connect a client and run full-text, semantic, and hybrid search -* [](/solutions/search/get-started/keyword-search-python.md): build a search query with Python +* [](/solutions/vector-database/vector-full-text-search.md): Connect a client and run full-text, semantic, and hybrid search. You can follow the examples in Python, TypeScript, PHP, Ruby, C#/.NET, Java, or Go. +* [](/solutions/search/get-started/index-basics.md): Create an index, add documents, and run a search. This tutorial goes further into indices, including dynamic and explicit mappings. +* [](/solutions/search/get-started/keyword-search-python.md): Build a keyword search query with Python. :::: diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index b9ba128122b..2106c28e1b4 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -9,18 +9,27 @@ type: how-to # Connect through an SDK [connect-through-an-sdk] -Install and configure an official {{es}} language client to connect to a project or cluster. +Use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language, so you can copy the example for your language and start sending requests. :::{note} To try things out without installing a client, you can also work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). ::: +## Before you begin + +You need two values from your deployment or project: + +- The {{es}} endpoint URL. The client uses it to reach {{es}}. +- An API key. The client uses it to authenticate. + +If you don't have them yet, refer to [](/solutions/search/set-up/api-key-and-endpoints.md). + :::::::{stepper} ::::::{step} Connect to your project :anchor: connect-through-an-sdk-connect -To get your {{es}} endpoint and API key, refer to [API key and endpoints](/solutions/search/set-up/api-key-and-endpoints.md). Set them as environment variables: +Set your {{es}} endpoint and API key as environment variables: :::::{tab-set} :group: operating-systems From fd1b1942147463ff2bcee7dc1f224aef2f123b6a Mon Sep 17 00:00:00 2001 From: kosabogi Date: Wed, 21 Oct 2026 11:39:34 +0200 Subject: [PATCH 23/48] Content refinements --- .../search-connection-details.md | 2 +- solutions/search/set-up/api-key-and-endpoints.md | 4 ++-- solutions/search/set-up/choose-a-deployment-type.md | 2 +- solutions/search/set-up/connect-through-an-sdk.md | 12 +++++------- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/solutions/elasticsearch-solution-project/search-connection-details.md b/solutions/elasticsearch-solution-project/search-connection-details.md index fb2764c5885..4110a8a76d7 100644 --- a/solutions/elasticsearch-solution-project/search-connection-details.md +++ b/solutions/elasticsearch-solution-project/search-connection-details.md @@ -18,7 +18,7 @@ To connect a client application or a third-party tool to {{es}}, you need two th ## Before you begin [before-you-begin] -To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. +To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. If you created the deployment or project, you already have this privilege. If you sign in as a different user, an administrator needs to grant it. In this case, refer to [](/deploy-manage/users-roles.md). ## Find your {{es}} endpoint [find-endpoint-cloud-self-managed] diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index dd6c56ebd76..fb3d48dd493 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -13,8 +13,8 @@ To connect a client to {{es}}, you need an endpoint URL and an API key. This pag ## Before you begin -* Access to your deployment or project, such as an {{es}} {{vectordb}} project, an {{es}} project, or an {{ech}} deployment. -* To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. +* You need access to your deployment or project, such as an {{es}} {{vectordb}} project, an {{es}} project, or an {{ech}} deployment. If you don't have one yet, refer to [](/solutions/search/set-up/choose-a-deployment-type.md). +* To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. If you created the deployment or project, you already have this privilege. If you sign in as a different user, an administrator needs to grant it. In this case, refer to [](/deploy-manage/users-roles.md). :::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md ::: diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 837c4901827..41b2b486100 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -21,7 +21,7 @@ Get {{es}} running in a few minutes. * **{{serverless-full}}**: Elastic automatically scales and upgrades the project. Projects are versionless, so you always get the latest features. - * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), [recommendations](/solutions/search/vector/vector-search-use-cases.md#discovery-and-recommendations), and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). + * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), recommendations, and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). * **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. The cluster runs a specific {{stack}} version. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index 2106c28e1b4..a52d689aea1 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -17,12 +17,10 @@ To try things out without installing a client, you can also work with {{es}} dat ## Before you begin -You need two values from your deployment or project: +You need the following: -- The {{es}} endpoint URL. The client uses it to reach {{es}}. -- An API key. The client uses it to authenticate. - -If you don't have them yet, refer to [](/solutions/search/set-up/api-key-and-endpoints.md). +- A running {{es}} deployment or project. If you don't have one yet, refer to [](/solutions/search/set-up/choose-a-deployment-type.md). +- The {{es}} endpoint URL, which the client uses to reach {{es}}, and an API key, which the client uses to authenticate. If you don't have them yet, refer to [](/solutions/search/set-up/api-key-and-endpoints.md). :::::::{stepper} @@ -38,7 +36,7 @@ Set your {{es}} endpoint and API key as environment variables: :sync: macos-linux ```bash -export ES_URL="" <1> +export ES_URL="YOUR_PROJECT_URL" <1> export ES_API_KEY="YOUR_API_KEY" ``` @@ -50,7 +48,7 @@ export ES_API_KEY="YOUR_API_KEY" :sync: windows-powershell ```powershell -$Env:ES_URL = "" <1> +$Env:ES_URL = "YOUR_PROJECT_URL" <1> $Env:ES_API_KEY = "YOUR_API_KEY" ``` From 595430dfa173320e10fe49dd63e52637bb46d372 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Thu, 22 Oct 2026 10:32:25 +0200 Subject: [PATCH 24/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: Liam Thompson --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index d2df2f1c97d..dbc491fb33d 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -51,7 +51,7 @@ Copy the {{es}} endpoint from the deployment UI or the {{ecloud}} Console. :::::{tab-set} -::::{tab-item} Deployment UI +::::{tab-item} {{kib}} UI 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your deployment and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. From 86077f6bce409ee8678dd01e2ff16232ee90f822 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Thu, 22 Oct 2026 10:36:55 +0200 Subject: [PATCH 25/48] Update solutions/search/set-up/connect-through-an-sdk.md Co-authored-by: Liam Thompson --- solutions/search/set-up/connect-through-an-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index a52d689aea1..dc42575ad6a 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -24,7 +24,7 @@ You need the following: :::::::{stepper} -::::::{step} Connect to your project +::::::{step} Connect to {{es}} :anchor: connect-through-an-sdk-connect Set your {{es}} endpoint and API key as environment variables: From 947dcb4aacec69440b05800d3e658f1800a3bc74 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Thu, 22 Oct 2026 11:23:31 +0200 Subject: [PATCH 26/48] Resolves comments --- .../_snippets/create-an-api-key.md | 12 + .../_snippets/deployment-tab-legend.md | 15 - .../_snippets/find-elasticsearch-endpoint.md | 10 +- .../search-connection-details.md | 3 - solutions/search/set-up.md | 2 +- .../search/set-up/api-key-and-endpoints.md | 9 +- .../search/set-up/connect-through-an-sdk.md | 574 +----------------- 7 files changed, 35 insertions(+), 590 deletions(-) delete mode 100644 solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index a208f9cc823..77413c70fbe 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -8,6 +8,8 @@ This snippet is in use in the following locations: ::::{applies-item} serverless: ga +Follow these steps to create an API key for an {{es}} {{vectordb}} project or an {{es}} project. + 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. @@ -20,6 +22,8 @@ Keys created here expire in 90 days and carry your own privileges. To set an exp ::::{applies-item} ech: ga +Follow these steps to create an API key for {{ech}}. + 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your deployment and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. @@ -32,6 +36,8 @@ Keys created here expire in 90 days and carry your own privileges. To set an exp ::::{applies-item} ece: ga +Follow these steps to create an API key for {{ece}}. + 1. Open {{kib}} for your deployment or project. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. @@ -43,6 +49,9 @@ Keys created here expire in 90 days and carry your own privileges. To set an exp :::: ::::{applies-item} {"deployment": {"self": "ga"}} + +Follow these steps to create an API key for a self-managed cluster, one you install and manage. + 1. Go to the **API keys** management page, using the [global search field](/explore-analyze/find-and-organize/find-apps-and-objects.md) to find it. 2. Select **Create API key**. 3. Enter a name, then select **Create API key**. @@ -52,6 +61,9 @@ Keys created here don't expire unless you add an expiration date. :::: ::::{applies-item} {"deployment": {"eck": "ga"}} + +Follow these steps to create an API key for {{eck}}. + 1. Go to the **API keys** management page, using the [global search field](/explore-analyze/find-and-organize/find-apps-and-objects.md) to find it. 2. Select **Create API key**. 3. Enter a name, then select **Create API key**. diff --git a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md b/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md deleted file mode 100644 index 7f96ca6cd8b..00000000000 --- a/solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md +++ /dev/null @@ -1,15 +0,0 @@ - - -:::{admonition} Deployment tabs -The deployment tabs below mean the following: - -* **Serverless**: an {{es}} {{vectordb}} project or an {{es}} project. -* **ECH**: {{ech}}. -* **ECE**: {{ece}}. -* **Self-managed**: a cluster you install and manage. -* **ECK**: {{eck}}. -::: diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index dbc491fb33d..dfb5dc3074f 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -7,7 +7,7 @@ This snippet is in use in the following locations: :::::::{applies-switch} ::::::{applies-item} serverless: ga -Copy the {{es}} endpoint from the project UI or the {{ecloud}} Console. +Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project from the project UI or the {{ecloud}} Console. :::::{tab-set} @@ -47,7 +47,7 @@ If your project runs on AWS and AWS PrivateLink is set up, the panel also lists :::::: ::::::{applies-item} ech: ga -Copy the {{es}} endpoint from the deployment UI or the {{ecloud}} Console. +Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Console. :::::{tab-set} @@ -85,7 +85,7 @@ Copy the {{es}} endpoint from the deployment UI or the {{ecloud}} Console. :::::: ::::{applies-item} ece: ga -Your endpoint details are in the **Connection details** panel in {{kib}}. +For {{ece}}, your endpoint details are in the **Connection details** panel in {{kib}}. 1. Open {{kib}} for your deployment. 2. From the **Help menu** {icon}`question`, select **Connection details**. @@ -104,7 +104,7 @@ When the space uses the **{{es}}** solution view, the **Getting started** page s :::: ::::{applies-item} {"deployment": {"self": "ga"}} -Your endpoint takes the form `://:`. Each part comes from your cluster's HTTP settings: +For a self-managed cluster, one you install and manage, your endpoint takes the form `://:`. Each part comes from your cluster's HTTP settings: * **Scheme**: `https` when TLS is enabled on the HTTP layer, and `http` when it isn't. [Automatic security setup](/deploy-manage/security/self-auto-setup.md) enables TLS on a new archive or package installation. * **Host**: The address clients use to reach the node, set by [`http.host` or `network.host`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). @@ -116,7 +116,7 @@ If clients reach your cluster through a load balancer, reverse proxy, or ingress :::: ::::{applies-item} {"deployment": {"eck": "ga"}} -The {{eck}} operator creates a `ClusterIP` service named `-es-http` on port `9200`, with TLS enabled by default. +For {{eck}}, the operator creates a `ClusterIP` service named `-es-http` on port `9200`, with TLS enabled by default. From inside the Kubernetes cluster, your endpoint is `https://-es-http:9200` in the same namespace, or `https://-es-http..svc:9200` from another namespace. List your services to confirm the name: diff --git a/solutions/elasticsearch-solution-project/search-connection-details.md b/solutions/elasticsearch-solution-project/search-connection-details.md index 4110a8a76d7..5b80eaf2f10 100644 --- a/solutions/elasticsearch-solution-project/search-connection-details.md +++ b/solutions/elasticsearch-solution-project/search-connection-details.md @@ -22,9 +22,6 @@ To create an API key, you need the `manage_api_key` or the `manage_own_api_key` ## Find your {{es}} endpoint [find-endpoint-cloud-self-managed] -:::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md -::: - :::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md ::: diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index aeff5d2601b..6cfeabfc110 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -13,4 +13,4 @@ If you're building search on {{es}}, start here. These pages take you from selec 1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. 2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. -3. [](/solutions/search/set-up/connect-through-an-sdk.md): Install a language client and send a request from code. +3. (Optional) [](/solutions/search/set-up/connect-through-an-sdk.md): Install a language client and send a request from code. You can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index fb3d48dd493..bc3391a514a 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -16,9 +16,6 @@ To connect a client to {{es}}, you need an endpoint URL and an API key. This pag * You need access to your deployment or project, such as an {{es}} {{vectordb}} project, an {{es}} project, or an {{ech}} deployment. If you don't have one yet, refer to [](/solutions/search/set-up/choose-a-deployment-type.md). * To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. If you created the deployment or project, you already have this privilege. If you sign in as a different user, an administrator needs to grant it. In this case, refer to [](/deploy-manage/users-roles.md). -:::{include} /solutions/elasticsearch-solution-project/_snippets/deployment-tab-legend.md -::: - :::::::::{stepper} ::::::::{step} Find your {{es}} endpoint @@ -34,11 +31,11 @@ The {{es}} endpoint is the URL your client uses to send requests. Where you find ::::::::{step} Create an API key :anchor: get-your-api-key -:::{tip} -If you just created a {{serverless-short}} project, the **Getting started** {icon}`rocket` page shows a generated API key that you can copy immediately. If you have navigated away from that page, create a new API key as described below. +:::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md ::: -:::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +:::{tip} +If you just created a {{serverless-short}} project, the **Getting started** {icon}`rocket` page shows a generated API key that you can copy immediately. If you have navigated away from that page, create a new API key as described above. ::: :::::::: diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-through-an-sdk.md index dc42575ad6a..2ab0806d457 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-through-an-sdk.md @@ -12,7 +12,7 @@ type: how-to Use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language, so you can copy the example for your language and start sending requests. :::{note} -To try things out without installing a client, you can also work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +To get started without installing a client, you can also work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). ::: ## Before you begin @@ -167,7 +167,7 @@ After installation, initialize the client: ```python import os -from elasticsearch import Elasticsearch, helpers +from elasticsearch import Elasticsearch es = Elasticsearch( os.environ["ES_URL"], @@ -227,11 +227,7 @@ es = Elasticsearch::Client.new( :sync: csharp ```csharp -using System.Text.Json; -using System.Text.Json.Serialization; using Elastic.Clients.Elasticsearch; -using Elastic.Clients.Elasticsearch.Core.Bulk; -using Elastic.Clients.Elasticsearch.Esql; using Elastic.Transport; var url = Environment.GetEnvironmentVariable("ES_URL") @@ -252,17 +248,7 @@ var es = new ElasticsearchClient(settings); ```java package quickstart; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.StringReader; - import co.elastic.clients.elasticsearch.ElasticsearchClient; -import co.elastic.clients.elasticsearch._types.Refresh; -import co.elastic.clients.elasticsearch.core.BulkRequest; -import co.elastic.clients.elasticsearch.core.SearchResponse; -import co.elastic.clients.elasticsearch.core.search.Hit; -import co.elastic.clients.elasticsearch.esql.EsqlFormat; -import co.elastic.clients.transport.endpoints.BinaryResponse; public class App { public static void main(String[] args) throws Exception { @@ -312,9 +298,7 @@ func main() { ::::::{step} Verify your connection :anchor: connect-through-an-sdk-verify -To verify your connection, create an index, index some sample data, and check the document count. - -1. Create an index called `books`: +Call the info API to confirm that your endpoint URL and API key work. A successful response includes the cluster name and version. :::::{tab-set} :group: languages @@ -323,16 +307,7 @@ To verify your connection, create an index, index some sample data, and check th :sync: python ```python -es.indices.create( - index="books", - mappings={ - "properties": { - "description": { - "type": "semantic_text", - } - } - }, -) +print(es.info()) ``` :::: @@ -341,16 +316,7 @@ es.indices.create( :sync: typescript ```typescript -await es.indices.create({ - index: "books", - mappings: { - properties: { - description: { - type: "semantic_text", - }, - }, - }, -}); +console.log(await es.info()); ``` :::: @@ -359,18 +325,7 @@ await es.indices.create({ :sync: php ```php -$es->indices()->create([ - "index" => "books", - "body" => [ - "mappings" => [ - "properties" => [ - "description" => [ - "type" => "semantic_text", - ], - ], - ], - ], -]); +echo $es->info()->asString(); ``` :::: @@ -379,18 +334,7 @@ $es->indices()->create([ :sync: ruby ```ruby -es.indices.create( - index: "books", - body: { - mappings: { - properties: { - description: { - type: "semantic_text" - } - } - } - } -) +puts es.info ``` :::: @@ -399,13 +343,8 @@ es.indices.create( :sync: csharp ```csharp -await es.Indices.CreateAsync("books", c => c - .Mappings(m => m - .Properties(p => p - .SemanticText(b => b.Description) - ) - ) -); +var info = await es.InfoAsync(); +Console.WriteLine(info); ``` :::: @@ -414,20 +353,7 @@ await es.Indices.CreateAsync("books", c => c :sync: java ```java -es.indices().create(c -> c - .index("books") - .withJson(new StringReader(""" - { - "mappings": { - "properties": { - "description": { - "type": "semantic_text" - } - } - } - } - """)) -); +System.out.println(es.info()); ``` :::: @@ -436,496 +362,24 @@ es.indices().create(c -> c :sync: go ```go -createResponse, err := es.Indices.Create( - "books", - es.Indices.Create.WithBody(strings.NewReader(`{ - "mappings": { - "properties": { - "description": { - "type": "semantic_text" - } - } - } - }`)), -) -if err != nil { - panic(err) -} -if createResponse.IsError() { - log.Fatal(createResponse) -} -createResponse.Body.Close() -``` - -:::: -::::: - -2. Index five sample books in one bulk request: - -:::::{tab-set} -:group: languages - -::::{tab-item} Python -:sync: python - -```python -books = [ - {"title": "The Left Hand of Darkness", "author": "Ursula K. Le Guin", "release_year": 1969, - "description": "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap."}, - {"title": "Project Hail Mary", "author": "Andy Weir", "release_year": 2021, - "description": "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth."}, - {"title": "The Name of the Wind", "author": "Patrick Rothfuss", "release_year": 2007, - "description": "A gifted young musician and magician tells the story of his rise from orphan to legend."}, - {"title": "Klara and the Sun", "author": "Kazuo Ishiguro", "release_year": 2021, - "description": "An artificial friend watches human love and loneliness while hoping a child will pick her."}, - {"title": "Dune", "author": "Frank Herbert", "release_year": 1965, - "description": "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power."}, -] - -helpers.bulk(es, ({"_index": "books", "_source": b} for b in books), refresh="wait_for") -``` - -:::: - -::::{tab-item} TypeScript -:sync: typescript - -```typescript -const books = [ - { - title: "The Left Hand of Darkness", - author: "Ursula K. Le Guin", - release_year: 1969, - description: "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap.", - }, - { - title: "Project Hail Mary", - author: "Andy Weir", - release_year: 2021, - description: "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth.", - }, - { - title: "The Name of the Wind", - author: "Patrick Rothfuss", - release_year: 2007, - description: "A gifted young musician and magician tells the story of his rise from orphan to legend.", - }, - { - title: "Klara and the Sun", - author: "Kazuo Ishiguro", - release_year: 2021, - description: "An artificial friend watches human love and loneliness while hoping a child will pick her.", - }, - { - title: "Dune", - author: "Frank Herbert", - release_year: 1965, - description: "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power.", - }, -]; - -await es.bulk({ - refresh: "wait_for", - operations: books.flatMap((book) => [ - { index: { _index: "books" } }, - book, - ]), -}); -``` - -:::: - -::::{tab-item} PHP -:sync: php - -```php -$books = [ - [ - "title" => "The Left Hand of Darkness", - "author" => "Ursula K. Le Guin", - "release_year" => 1969, - "description" => "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap.", - ], - [ - "title" => "Project Hail Mary", - "author" => "Andy Weir", - "release_year" => 2021, - "description" => "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth.", - ], - [ - "title" => "The Name of the Wind", - "author" => "Patrick Rothfuss", - "release_year" => 2007, - "description" => "A gifted young musician and magician tells the story of his rise from orphan to legend.", - ], - [ - "title" => "Klara and the Sun", - "author" => "Kazuo Ishiguro", - "release_year" => 2021, - "description" => "An artificial friend watches human love and loneliness while hoping a child will pick her.", - ], - [ - "title" => "Dune", - "author" => "Frank Herbert", - "release_year" => 1965, - "description" => "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power.", - ], -]; - -$operations = []; -foreach ($books as $book) { - $operations[] = [ - "index" => [ - "_index" => "books", - ], - ]; - $operations[] = $book; -} - -$es->bulk([ - "refresh" => "wait_for", - "body" => $operations, -]); -``` - -:::: - -::::{tab-item} Ruby -:sync: ruby - -```ruby -books = [ - { - title: "The Left Hand of Darkness", - author: "Ursula K. Le Guin", - release_year: 1969, - description: "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap." - }, - { - title: "Project Hail Mary", - author: "Andy Weir", - release_year: 2021, - description: "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth." - }, - { - title: "The Name of the Wind", - author: "Patrick Rothfuss", - release_year: 2007, - description: "A gifted young musician and magician tells the story of his rise from orphan to legend." - }, - { - title: "Klara and the Sun", - author: "Kazuo Ishiguro", - release_year: 2021, - description: "An artificial friend watches human love and loneliness while hoping a child will pick her." - }, - { - title: "Dune", - author: "Frank Herbert", - release_year: 1965, - description: "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power." - } -] - -operations = books.flat_map do |book| - [ - { index: { _index: "books" } }, - book - ] -end - -es.bulk( - body: operations, - refresh: "wait_for" -) -``` - -:::: - -::::{tab-item} C#/.NET -:sync: csharp - -```csharp -var books = new[] -{ - new Book( - "The Left Hand of Darkness", - "Ursula K. Le Guin", - 1969, - "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap." - ), - new Book( - "Project Hail Mary", - "Andy Weir", - 2021, - "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth." - ), - new Book( - "The Name of the Wind", - "Patrick Rothfuss", - 2007, - "A gifted young musician and magician tells the story of his rise from orphan to legend." - ), - new Book( - "Klara and the Sun", - "Kazuo Ishiguro", - 2021, - "An artificial friend watches human love and loneliness while hoping a child will pick her." - ), - new Book( - "Dune", - "Frank Herbert", - 1965, - "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power." - ) -}; - -var operations = new BulkOperationsCollection(); -foreach (var book in books) -{ - operations.Add(new BulkIndexOperation(book) - { - Index = "books" - }); -} - -await es.BulkAsync(new BulkRequest -{ - Refresh = Refresh.WaitFor, - Operations = operations -}); - -public record Book( - string Title, - string Author, - [property: JsonPropertyName("release_year")] int ReleaseYear, - string Description -); -``` - -:::: - -::::{tab-item} Java -:sync: java - -```java -record Book( - String title, - String author, - int release_year, - String description -) {} - -Book[] books = { - new Book( - "The Left Hand of Darkness", - "Ursula K. Le Guin", - 1969, - "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap." - ), - new Book( - "Project Hail Mary", - "Andy Weir", - 2021, - "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth." - ), - new Book( - "The Name of the Wind", - "Patrick Rothfuss", - 2007, - "A gifted young musician and magician tells the story of his rise from orphan to legend." - ), - new Book( - "Klara and the Sun", - "Kazuo Ishiguro", - 2021, - "An artificial friend watches human love and loneliness while hoping a child will pick her." - ), - new Book( - "Dune", - "Frank Herbert", - 1965, - "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power." - ) -}; - -BulkRequest.Builder bulk = new BulkRequest.Builder() - .refresh(Refresh.WaitFor); - -for (Book book : books) { - bulk.operations(op -> op - .index(idx -> idx - .index("books") - .document(book) - ) - ); -} - -es.bulk(bulk.build()); -``` - -:::: - -::::{tab-item} Go -:sync: go - -```go -type Book struct { - Title string `json:"title"` - Author string `json:"author"` - ReleaseYear int `json:"release_year"` - Description string `json:"description"` -} - -books := []Book{ - { - Title: "The Left Hand of Darkness", - Author: "Ursula K. Le Guin", - ReleaseYear: 1969, - Description: "An envoy visits an icy planet whose people have no fixed gender, feeling out politics and friendship across a deep cultural gap.", - }, - { - Title: "Project Hail Mary", - Author: "Andy Weir", - ReleaseYear: 2021, - Description: "A lone astronaut wakes with amnesia on a spaceship and has to stop a disaster that threatens all life on Earth.", - }, - { - Title: "The Name of the Wind", - Author: "Patrick Rothfuss", - ReleaseYear: 2007, - Description: "A gifted young musician and magician tells the story of his rise from orphan to legend.", - }, - { - Title: "Klara and the Sun", - Author: "Kazuo Ishiguro", - ReleaseYear: 2021, - Description: "An artificial friend watches human love and loneliness while hoping a child will pick her.", - }, - { - Title: "Dune", - Author: "Frank Herbert", - ReleaseYear: 1965, - Description: "On a desert planet prized for a rare spice, a young heir is pulled into a war over ecology, religion, and power.", - }, -} - -indexer, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{ - Client: es, - Index: "books", - Refresh: "wait_for", -}) -if err != nil { - panic(err) -} - -ctx := context.Background() -for _, book := range books { - data, err := json.Marshal(book) - if err != nil { - panic(err) - } - - err = indexer.Add(ctx, esutil.BulkIndexerItem{ - Action: "index", - Body: bytes.NewReader(data), - }) - if err != nil { - panic(err) - } -} - -if err := indexer.Close(ctx); err != nil { - panic(err) -} -``` - -::::: - -3. Verify the documents were indexed: - -:::::{tab-set} -:group: languages - -::::{tab-item} Python -:sync: python - -```python -es.count(index="books") -``` - -:::: - -::::{tab-item} TypeScript -:sync: typescript - -```typescript -await es.count({ index: "books" }); -``` - -:::: - -::::{tab-item} PHP -:sync: php - -```php -$es->count([ - "index" => "books", -]); -``` - -:::: - -::::{tab-item} Ruby -:sync: ruby - -```ruby -es.count(index: "books") -``` - -:::: - -::::{tab-item} C#/.NET -:sync: csharp - -```csharp -await es.CountAsync(c => c.Indices("books")); -``` - -:::: - -::::{tab-item} Java -:sync: java - -```java -es.count(c -> c.index("books")); -``` - -:::: - -::::{tab-item} Go -:sync: go - -```go -countRes, err := es.Count(es.Count.WithIndex("books")) +res, err := es.Info() if err != nil { log.Fatal(err) } -countRes.Body.Close() +defer res.Body.Close() +log.Println(res) ``` :::: ::::: -The response returns a count of 5, which confirms that all five books were indexed. - :::::: ::::::{step} Next steps :anchor: connect-through-an-sdk-next -{{es}} is up and running, and you have already indexed a small sample dataset. Next, learn how to ingest your own data at scale in [](/solutions/search/ingest-for-search.md). +{{es}} is up and running. Next, learn how to ingest your own data in [](/solutions/search/ingest-for-search.md). :::::: From 621db3391b6695abe0dacb701ccfee59f07bd36d Mon Sep 17 00:00:00 2001 From: kosabogi Date: Thu, 22 Oct 2026 14:29:15 +0200 Subject: [PATCH 27/48] Addresses feedback --- redirects.yml | 8 ++++++++ solutions/search/set-up.md | 2 +- solutions/search/set-up/api-key-and-endpoints.md | 2 +- ...ct-through-an-sdk.md => connect-with-an-sdk.md} | 14 +++++++------- solutions/toc.yml | 2 +- 5 files changed, 18 insertions(+), 10 deletions(-) rename solutions/search/set-up/{connect-through-an-sdk.md => connect-with-an-sdk.md} (95%) diff --git a/redirects.yml b/redirects.yml index c6cfd5f0c78..e37babe9212 100644 --- a/redirects.yml +++ b/redirects.yml @@ -60,6 +60,14 @@ redirects: 'solutions/search/search-applications.md': 'solutions/elasticsearch-solution-project/search-applications.md' 'solutions/search/search-applications/search-application-client.md': 'solutions/elasticsearch-solution-project/search-applications/search-application-client.md' 'solutions/search/search-connection-details.md': 'solutions/elasticsearch-solution-project/search-connection-details.md' + 'solutions/search/set-up/connect-through-an-sdk.md': + to: 'solutions/search/set-up/connect-with-an-sdk.md' + anchors: + 'connect-through-an-sdk': 'connect-with-an-sdk' + 'connect-through-an-sdk-connect': 'connect-with-an-sdk-connect' + 'connect-through-an-sdk-install': 'connect-with-an-sdk-install' + 'connect-through-an-sdk-verify': 'connect-with-an-sdk-verify' + 'connect-through-an-sdk-next': 'connect-with-an-sdk-next' 'solutions/search/ai-assistant.md': 'explore-analyze/ai-features/ai-chat-experiences.md' 'solutions/elasticsearch-solution-project/ai-assistant.md': 'explore-analyze/ai-features/ai-chat-experiences.md' 'solutions/search/rag/playground.md': 'solutions/elasticsearch-solution-project/playground.md' diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 6cfeabfc110..b65e9b5b187 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -13,4 +13,4 @@ If you're building search on {{es}}, start here. These pages take you from selec 1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. 2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. -3. (Optional) [](/solutions/search/set-up/connect-through-an-sdk.md): Install a language client and send a request from code. You can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +3. If you want to connect programmatically, you can [connect with an SDK](/solutions/search/set-up/connect-with-an-sdk.md), install a language client, and send a request from code. You can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index bc3391a514a..5c00e6608b4 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -43,7 +43,7 @@ If you just created a {{serverless-short}} project, the **Getting started** {ico ::::::::{step} Next step :anchor: api-key-and-endpoints-next -After you have an endpoint and an API key, connect a language client in [](/solutions/search/set-up/connect-through-an-sdk.md). +After you have an endpoint and an API key, connect a language client in [](/solutions/search/set-up/connect-with-an-sdk.md). :::::::: diff --git a/solutions/search/set-up/connect-through-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md similarity index 95% rename from solutions/search/set-up/connect-through-an-sdk.md rename to solutions/search/set-up/connect-with-an-sdk.md index 2ab0806d457..c7a6e53bc83 100644 --- a/solutions/search/set-up/connect-through-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -2,12 +2,12 @@ applies_to: stack: serverless: -navigation_title: Connect through an SDK +navigation_title: Connect with an SDK description: Install an official Elasticsearch language client, connect it with your endpoint and API key, and verify the connection. type: how-to --- -# Connect through an SDK [connect-through-an-sdk] +# Connect with an SDK [connect-with-an-sdk] Use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language, so you can copy the example for your language and start sending requests. @@ -25,7 +25,7 @@ You need the following: :::::::{stepper} ::::::{step} Connect to {{es}} -:anchor: connect-through-an-sdk-connect +:anchor: connect-with-an-sdk-connect Set your {{es}} endpoint and API key as environment variables: @@ -61,7 +61,7 @@ $Env:ES_API_KEY = "YOUR_API_KEY" :::::: ::::::{step} Install and initialize a client -:anchor: connect-through-an-sdk-install +:anchor: connect-with-an-sdk-install Install the client for your language. For a list of available clients, refer to [{{es}} clients](/reference/elasticsearch-clients/index.md). @@ -296,7 +296,7 @@ func main() { :::::: ::::::{step} Verify your connection -:anchor: connect-through-an-sdk-verify +:anchor: connect-with-an-sdk-verify Call the info API to confirm that your endpoint URL and API key work. A successful response includes the cluster name and version. @@ -377,9 +377,9 @@ log.Println(res) :::::: ::::::{step} Next steps -:anchor: connect-through-an-sdk-next +:anchor: connect-with-an-sdk-next -{{es}} is up and running. Next, learn how to ingest your own data in [](/solutions/search/ingest-for-search.md). +{{es}} is up and running, and your application is connected. Next, learn how to ingest your own data in [](/solutions/search/ingest-for-search.md). :::::: diff --git a/solutions/toc.yml b/solutions/toc.yml index c5a95fb8e48..469e3a7d7c2 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -15,7 +15,7 @@ toc: children: - file: search/set-up/choose-a-deployment-type.md - file: search/set-up/api-key-and-endpoints.md - - file: search/set-up/connect-through-an-sdk.md + - file: search/set-up/connect-with-an-sdk.md - file: search/ingest-for-search.md children: - file: search/search-pipelines.md From 7eb6c326bab429bd731af5c1ca3ce8937bed2850 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Thu, 22 Oct 2026 14:43:56 +0200 Subject: [PATCH 28/48] Removes unnecesseary redirect --- redirects.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/redirects.yml b/redirects.yml index e37babe9212..c6cfd5f0c78 100644 --- a/redirects.yml +++ b/redirects.yml @@ -60,14 +60,6 @@ redirects: 'solutions/search/search-applications.md': 'solutions/elasticsearch-solution-project/search-applications.md' 'solutions/search/search-applications/search-application-client.md': 'solutions/elasticsearch-solution-project/search-applications/search-application-client.md' 'solutions/search/search-connection-details.md': 'solutions/elasticsearch-solution-project/search-connection-details.md' - 'solutions/search/set-up/connect-through-an-sdk.md': - to: 'solutions/search/set-up/connect-with-an-sdk.md' - anchors: - 'connect-through-an-sdk': 'connect-with-an-sdk' - 'connect-through-an-sdk-connect': 'connect-with-an-sdk-connect' - 'connect-through-an-sdk-install': 'connect-with-an-sdk-install' - 'connect-through-an-sdk-verify': 'connect-with-an-sdk-verify' - 'connect-through-an-sdk-next': 'connect-with-an-sdk-next' 'solutions/search/ai-assistant.md': 'explore-analyze/ai-features/ai-chat-experiences.md' 'solutions/elasticsearch-solution-project/ai-assistant.md': 'explore-analyze/ai-features/ai-chat-experiences.md' 'solutions/search/rag/playground.md': 'solutions/elasticsearch-solution-project/playground.md' From fe3478c973b61ce4d93ad6b34dbb2444329fa266 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Thu, 22 Oct 2026 15:05:08 +0200 Subject: [PATCH 29/48] Update solutions/search/set-up/api-key-and-endpoints.md Co-authored-by: Liam Thompson --- solutions/search/set-up/api-key-and-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index 5c00e6608b4..75a870c2582 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -7,7 +7,7 @@ description: Find your Elasticsearch endpoint and create an API key so you can c type: how-to --- -# Get your API key and endpoints [get-your-api-key-and-endpoints] +# Get your API key and {{es}} endpoint [get-your-api-key-and-endpoints] To connect a client to {{es}}, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type, including {{serverless-full}} projects, {{ech}}, {{ece}}, self-managed clusters, and {{eck}}. From a2dff19b606735f06e9b4050dcad560d4f6ee5a4 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Thu, 22 Oct 2026 15:05:24 +0200 Subject: [PATCH 30/48] Update solutions/search/set-up/connect-with-an-sdk.md Co-authored-by: Liam Thompson --- solutions/search/set-up/connect-with-an-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/connect-with-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md index c7a6e53bc83..597aca2cb57 100644 --- a/solutions/search/set-up/connect-with-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -7,7 +7,7 @@ description: Install an official Elasticsearch language client, connect it with type: how-to --- -# Connect with an SDK [connect-with-an-sdk] +# Connect to {{es}} with an SDK [connect-with-an-sdk] Use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language, so you can copy the example for your language and start sending requests. From ac14a837f2a40273ea8a2f0daeb043491c6f4a0e Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Thu, 22 Oct 2026 15:05:46 +0200 Subject: [PATCH 31/48] Update solutions/search/set-up/connect-with-an-sdk.md Co-authored-by: Liam Thompson --- solutions/search/set-up/connect-with-an-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/connect-with-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md index 597aca2cb57..479d2de11cc 100644 --- a/solutions/search/set-up/connect-with-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -9,7 +9,7 @@ type: how-to # Connect to {{es}} with an SDK [connect-with-an-sdk] -Use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language, so you can copy the example for your language and start sending requests. +You can use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language. :::{note} To get started without installing a client, you can also work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). From 01171b287ccdb492f2015e99423ae466f049ffd6 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Thu, 22 Oct 2026 15:06:00 +0200 Subject: [PATCH 32/48] Update solutions/search/set-up/api-key-and-endpoints.md Co-authored-by: Liam Thompson --- solutions/search/set-up/api-key-and-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index 75a870c2582..db7952f6b46 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -9,7 +9,7 @@ type: how-to # Get your API key and {{es}} endpoint [get-your-api-key-and-endpoints] -To connect a client to {{es}}, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type, including {{serverless-full}} projects, {{ech}}, {{ece}}, self-managed clusters, and {{eck}}. +If you want to work with {{es}} programmatically, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type, including {{serverless-full}} projects, {{ech}}, {{ece}}, self-managed clusters, and {{eck}}. ## Before you begin From a11f9adff18f4ebaf4260779741229737a16108e Mon Sep 17 00:00:00 2001 From: kosabogi Date: Thu, 22 Oct 2026 15:24:55 +0200 Subject: [PATCH 33/48] Subsitutions and H1 SEO --- .../_snippets/find-endpoint-serverless-console.md | 2 +- .../_snippets/create-an-api-key.md | 6 +++--- .../_snippets/find-elasticsearch-endpoint.md | 10 +++++----- .../search-connection-details.md | 4 ++-- solutions/search/set-up.md | 2 +- solutions/search/set-up/api-key-and-endpoints.md | 4 ++-- solutions/search/set-up/choose-a-deployment-type.md | 4 ++-- solutions/search/set-up/connect-with-an-sdk.md | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md index d9f32c1b7a8..2d8bf09a561 100644 --- a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md +++ b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md @@ -4,7 +4,7 @@ 4. Copy the **Endpoint** value. :::{image} /solutions/images/cloud-console-serverless-endpoint.png - :alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons + :alt: The {{es}} panel on a Serverless project page in the {{ecloud}} Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons :screenshot: :width: 50% ::: diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index 77413c70fbe..5426419c1c0 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -14,7 +14,7 @@ Follow these steps to create an API key for an {{es}} {{vectordb}} project or an 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. 4. In the **API key name** field, enter a name, then select **Create API key**. -5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. +5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **{{beats}}** or **{{ls}}** to configure those products. 6. Copy the key. It isn't available after you close the panel. Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. @@ -28,7 +28,7 @@ Follow these steps to create an API key for {{ech}}. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. 4. In the **API key name** field, enter a name, then select **Create API key**. -5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. +5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **{{beats}}** or **{{ls}}** to configure those products. 6. Copy the key. It isn't available after you close the panel. Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. @@ -42,7 +42,7 @@ Follow these steps to create an API key for {{ece}}. 2. From the **Help menu** {icon}`question`, select **Connection details**. 3. Select the **API key** tab. 4. In the **API key name** field, enter a name, then select **Create API key**. -5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **Beats** or **Logstash** to configure those products. +5. Select an **API key format**: **Encoded** for {{es}} REST API requests, or **{{beats}}** or **{{ls}}** to configure those products. 6. Copy the key. It isn't available after you close the panel. Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index dfb5dc3074f..210182bfd6e 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -18,7 +18,7 @@ Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project 3. On the **Endpoints** tab, copy the **{{es}} endpoint**. :::{image} /solutions/images/kibana-connection-details-endpoints.png -:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab +:alt: The Connection details panel showing the {{es}} endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab :screenshot: :width: 50% ::: @@ -33,7 +33,7 @@ Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project 4. Copy the **Endpoint** value. :::{image} /solutions/images/cloud-console-serverless-endpoint.png -:alt: The Elasticsearch panel on a Serverless project page in the Elastic Cloud Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons +:alt: The {{es}} panel on a Serverless project page in the {{ecloud}} Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons :screenshot: :width: 50% ::: @@ -58,7 +58,7 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co 3. On the **Endpoints** tab, copy the **{{es}} endpoint**. :::{image} /solutions/images/kibana-connection-details-endpoints.png -:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab +:alt: The Connection details panel showing the {{es}} endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab :screenshot: :width: 50% ::: @@ -73,7 +73,7 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co 4. Copy the **Endpoint** value. :::{image} /solutions/images/cloud-console-hosted-endpoint.png -:alt: The Elasticsearch panel on a hosted deployment page in the Elastic Cloud Console, showing the Endpoint value with a copy button +:alt: The {{es}} panel on a hosted deployment page in the {{ecloud}} Console, showing the Endpoint value with a copy button :screenshot: :width: 50% ::: @@ -92,7 +92,7 @@ For {{ece}}, your endpoint details are in the **Connection details** panel in {{ 3. Copy the **{{es}} endpoint** from the **Endpoints** tab. :::{image} /solutions/images/kibana-connection-details-endpoints.png -:alt: The Connection details panel showing the Elasticsearch endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab +:alt: The Connection details panel showing the {{es}} endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab :screenshot: :width: 50% ::: diff --git a/solutions/elasticsearch-solution-project/search-connection-details.md b/solutions/elasticsearch-solution-project/search-connection-details.md index 5b80eaf2f10..e9ca517ae99 100644 --- a/solutions/elasticsearch-solution-project/search-connection-details.md +++ b/solutions/elasticsearch-solution-project/search-connection-details.md @@ -1,6 +1,6 @@ --- navigation_title: Find connection details -description: Find your Elasticsearch endpoint and create an API key so that client applications and tools can connect to your cluster or project. +description: Find your {{es}} endpoint and create an API key so that client applications and tools can connect to your cluster or project. mapped_pages: - https://www.elastic.co/guide/en/kibana/current/search-space-connection-details.html applies_to: @@ -98,6 +98,6 @@ If your cluster uses a self-signed certificate, pass your CA certificate with `c ## Related pages -* [Configure Beats and {{ls}} with a Cloud ID](/deploy-manage/deploy/elastic-cloud/find-cloud-id.md) +* [Configure {{beats}} and {{ls}} with a Cloud ID](/deploy-manage/deploy/elastic-cloud/find-cloud-id.md) * [Connect to {{es}} on {{ece}}](/deploy-manage/deploy/cloud-enterprise/connect-elasticsearch.md) * [Securing HTTP client applications](/deploy-manage/security/httprest-clients-security.md) diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index b65e9b5b187..dcc6615b521 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -3,7 +3,7 @@ applies_to: stack: serverless: navigation_title: Set up -description: Prepare Elasticsearch for search by selecting a deployment type, then connecting with an endpoint, API key, and language client. +description: Prepare {{es}} for search by selecting a deployment type, then connecting with an endpoint, API key, and language client. type: overview --- diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index db7952f6b46..b1c8b36d07b 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -3,11 +3,11 @@ applies_to: stack: serverless: navigation_title: API key and endpoints -description: Find your Elasticsearch endpoint and create an API key so you can connect a search client. +description: Find your {{es}} endpoint and create an API key so you can connect a search client. type: how-to --- -# Get your API key and {{es}} endpoint [get-your-api-key-and-endpoints] +# Get your {{es}} endpoint and API key [get-your-api-key-and-endpoints] If you want to work with {{es}} programmatically, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type, including {{serverless-full}} projects, {{ech}}, {{ece}}, self-managed clusters, and {{eck}}. diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 41b2b486100..6ae314ee08f 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -3,11 +3,11 @@ applies_to: stack: serverless: navigation_title: Choose a deployment type -description: Select an Elasticsearch deployment model for search, get it running, and try a search quickstart. +description: Select an {{es}} deployment model for search, get it running, and try a search quickstart. type: overview --- -# Choose a deployment type [choose-a-deployment-type] +# Choose an {{es}} deployment type [choose-a-deployment-type] {{es}} is at the core of every Elastic deployment type. The deployment type you choose determines who manages the infrastructure, scaling, and upgrades, and how usage is billed. Use this page to compare the options and find the best fit for your operational needs. diff --git a/solutions/search/set-up/connect-with-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md index 479d2de11cc..0052bdf6f99 100644 --- a/solutions/search/set-up/connect-with-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -3,7 +3,7 @@ applies_to: stack: serverless: navigation_title: Connect with an SDK -description: Install an official Elasticsearch language client, connect it with your endpoint and API key, and verify the connection. +description: Install an official {{es}} language client, connect it with your endpoint and API key, and verify the connection. type: how-to --- From 16d31904e51ebd0a06c675d5e7ce1a018099b257 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:12:45 +0100 Subject: [PATCH 34/48] Update solutions/search/set-up.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- solutions/search/set-up.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index dcc6615b521..395ab72a706 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -13,4 +13,6 @@ If you're building search on {{es}}, start here. These pages take you from selec 1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. 2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. -3. If you want to connect programmatically, you can [connect with an SDK](/solutions/search/set-up/connect-with-an-sdk.md), install a language client, and send a request from code. You can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +3. [Connect programmatically](/solutions/search/set-up/connect-with-an-sdk.md): Connect with an SDK, install a language client, and send a request from code. + +If you don't want to connect programmatically, you can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). From 9cf83d2f80d1d34b0b5f5ec493e1f6f438091006 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:31:24 +0100 Subject: [PATCH 35/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- solutions/search/set-up/choose-a-deployment-type.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 6ae314ee08f..5e02e3e70da 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -21,6 +21,9 @@ Get {{es}} running in a few minutes. * **{{serverless-full}}**: Elastic automatically scales and upgrades the project. Projects are versionless, so you always get the latest features. + + Serverless has two project types optimized for different search workloads. Choose the one that matches your data and use case: + * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), recommendations, and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). * **[{{ech}}](/deploy-manage/deploy/elastic-cloud/create-an-elastic-cloud-hosted-deployment.md)**: You size, scale, and upgrade the cluster yourself, and you select the hardware profile it runs on. The cluster runs a specific {{stack}} version. Sign up for a [14-day free trial](https://cloud.elastic.co/registration). From 1ad85b25912b2e279831cdc1f8dcd40afe20dc6d Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:33:20 +0100 Subject: [PATCH 36/48] Update solutions/search/set-up/choose-a-deployment-type.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- solutions/search/set-up/choose-a-deployment-type.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/choose-a-deployment-type.md index 5e02e3e70da..c87fd9f1a98 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/choose-a-deployment-type.md @@ -33,7 +33,9 @@ Get {{es}} running in a few minutes. * **[Local development](/deploy-manage/deploy/self-managed/local-development-installation-quickstart.md)**: Get started quickly with {{es}} and {{kib}} in Docker for local development and testing. :::{tip} -Elastic also offers other deployment types. Refer to the [deployment comparison](/deploy-manage/deploy/deployment-comparison.md) to learn more. +These are the fastest ways to get {{es}} running for search. Elastic offers additional deployment types for production workloads on your own infrastructure. + +For more detail on the options listed here, and to compare all deployment types across factors like data residency, compliance, feature availability, and infrastructure control, refer to the [full list of deployment options](/deploy-manage/deploy.md) and the [detailed feature comparison](/deploy-manage/deploy/deployment-comparison.md). ::: :::: From ff936cf7222817800ae76648240f40f4b5a44a77 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:34:35 +0100 Subject: [PATCH 37/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 210182bfd6e..71992608505 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -27,8 +27,7 @@ Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project ::::{tab-item} {{ecloud}} Console -1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. -2. Find your project and select **Manage**. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. 3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. 4. Copy the **Endpoint** value. From af160e8fde915cb3b45c86be5b9e084ef472c562 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:35:11 +0100 Subject: [PATCH 38/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 71992608505..91bce38e1ff 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -28,7 +28,7 @@ Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project ::::{tab-item} {{ecloud}} Console 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. -3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. +3. Under **Application endpoints**, select **{{es}}**. 4. Copy the **Endpoint** value. :::{image} /solutions/images/cloud-console-serverless-endpoint.png From 7ad41c0497fece1680e28d6d3727ece09ac7827c Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:36:14 +0100 Subject: [PATCH 39/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 91bce38e1ff..4bf2b2a62ef 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -29,7 +29,7 @@ Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. 3. Under **Application endpoints**, select **{{es}}**. -4. Copy the **Endpoint** value. +4. Copy the **Direct endpoint** value. :::{image} /solutions/images/cloud-console-serverless-endpoint.png :alt: The {{es}} panel on a Serverless project page in the {{ecloud}} Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons From 110eb4c87078afdfa13c147dd81ba108e4984e0b Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:38:12 +0100 Subject: [PATCH 40/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 4bf2b2a62ef..96a5a6dc3cf 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -37,7 +37,7 @@ Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project :width: 50% ::: -If your project runs on AWS and AWS PrivateLink is set up, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). +Azure and AWS also offer an endpoint you can use to connect to the deployment over a private connection. [Learn more about private connectivity](/deploy-manage/security/private-connectivity.md). :::: From 24953b422ae1ff8a1b33bc0464de8de6d585c794 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:39:23 +0100 Subject: [PATCH 41/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 96a5a6dc3cf..cb33723e2c6 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -66,8 +66,7 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co ::::{tab-item} {{ecloud}} Console -1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Hosted**. -2. Select your deployment. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. 3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. 4. Copy the **Endpoint** value. From 1a4d8bc29a34fb7aac960338ecf74c9f0e75e4b7 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:40:23 +0100 Subject: [PATCH 42/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index cb33723e2c6..f1ee769dfe0 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -68,7 +68,7 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. 3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. -4. Copy the **Endpoint** value. +4. Copy the **Direct endpoint** value. :::{image} /solutions/images/cloud-console-hosted-endpoint.png :alt: The {{es}} panel on a hosted deployment page in the {{ecloud}} Console, showing the Endpoint value with a copy button From f0bc81afd8515cb7e21dc25b50080b1c0f7fea12 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:41:13 +0100 Subject: [PATCH 43/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index f1ee769dfe0..9fe87e3f6e3 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -54,7 +54,7 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your deployment and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. -3. On the **Endpoints** tab, copy the **{{es}} endpoint**. +3. On the **Endpoints** tab, copy the **{{es}} endpoint** value. :::{image} /solutions/images/kibana-connection-details-endpoints.png :alt: The Connection details panel showing the {{es}} endpoint on the Endpoints tab, with the Show Cloud ID toggle and the API key tab From c45235cb90a25a7ca61ccd28bc759b73d1f042c8 Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:44:04 +0100 Subject: [PATCH 44/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 9fe87e3f6e3..ca14f5c748c 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -114,15 +114,13 @@ If clients reach your cluster through a load balancer, reverse proxy, or ingress :::: ::::{applies-item} {"deployment": {"eck": "ga"}} -For {{eck}}, the operator creates a `ClusterIP` service named `-es-http` on port `9200`, with TLS enabled by default. +The ECK operator automatically creates a service for your {{es}} cluster with TLS enabled. Your endpoint URL depends on where your application runs: -From inside the Kubernetes cluster, your endpoint is `https://-es-http:9200` in the same namespace, or `https://-es-http..svc:9200` from another namespace. List your services to confirm the name: +- **Inside the same Kubernetes namespace**: `https://-es-http:9200` +- **In a different namespace**: `https://-es-http..svc:9200` +- **Outside the Kubernetes cluster**: You need to expose the service first. Refer to [Access the endpoint](/deploy-manage/deploy/cloud-on-k8s/accessing-services.md#k8s-request-elasticsearch-endpoint) for setup steps. -```sh -kubectl get svc -``` - -To reach the cluster from outside, expose the service and use its external address. Refer to [Access the endpoint](/deploy-manage/deploy/cloud-on-k8s/accessing-services.md#k8s-request-elasticsearch-endpoint) for both cases, including how to retrieve the certificate authority (CA) certificate. +To find your cluster name, run `kubectl get svc` and look for the service ending in `-es-http`. :::: ::::::: From b55f17ada2eca1a9600b88fdd608b610ed711c92 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Mon, 26 Oct 2026 12:15:01 +0100 Subject: [PATCH 45/48] Address review feedback Co-Authored-By: Claude Sonnet 5.5 --- .../_snippets/create-an-api-key.md | 2 +- .../_snippets/find-elasticsearch-endpoint.md | 2 +- solutions/search/set-up.md | 2 +- .../search/set-up/api-key-and-endpoints.md | 23 ++++--------------- .../search/set-up/connect-with-an-sdk.md | 7 +++--- ...> get-elasticsearch-running-for-search.md} | 7 +++--- solutions/toc.yml | 2 +- 7 files changed, 16 insertions(+), 29 deletions(-) rename solutions/search/set-up/{choose-a-deployment-type.md => get-elasticsearch-running-for-search.md} (89%) diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index 5426419c1c0..6fd40dfa403 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -8,7 +8,7 @@ This snippet is in use in the following locations: ::::{applies-item} serverless: ga -Follow these steps to create an API key for an {{es}} {{vectordb}} project or an {{es}} project. +Follow these steps to create an API key for your project. 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Open**. 2. From the **Help menu** {icon}`question`, select **Connection details**. diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 210182bfd6e..26a503f4fe3 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -7,7 +7,7 @@ This snippet is in use in the following locations: :::::::{applies-switch} ::::::{applies-item} serverless: ga -Copy the {{es}} endpoint for an {{es}} {{vectordb}} project or an {{es}} project from the project UI or the {{ecloud}} Console. +Copy the {{es}} endpoint for your project from the project UI or the {{ecloud}} Console. :::::{tab-set} diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index dcc6615b521..4e9252acac9 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -11,6 +11,6 @@ type: overview If you're building search on {{es}}, start here. These pages take you from selecting where to run {{es}} to sending your first request from code. -1. [](/solutions/search/set-up/choose-a-deployment-type.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. +1. [](/solutions/search/set-up/get-elasticsearch-running-for-search.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. 2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. 3. If you want to connect programmatically, you can [connect with an SDK](/solutions/search/set-up/connect-with-an-sdk.md), install a language client, and send a request from code. You can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). diff --git a/solutions/search/set-up/api-key-and-endpoints.md b/solutions/search/set-up/api-key-and-endpoints.md index b1c8b36d07b..e92f8a09441 100644 --- a/solutions/search/set-up/api-key-and-endpoints.md +++ b/solutions/search/set-up/api-key-and-endpoints.md @@ -9,27 +9,21 @@ type: how-to # Get your {{es}} endpoint and API key [get-your-api-key-and-endpoints] -If you want to work with {{es}} programmatically, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type, including {{serverless-full}} projects, {{ech}}, {{ece}}, self-managed clusters, and {{eck}}. +If you want to work with {{es}} programmatically, you need an endpoint URL and an API key. This page shows how to find the endpoint and create an API key for each deployment type. ## Before you begin -* You need access to your deployment or project, such as an {{es}} {{vectordb}} project, an {{es}} project, or an {{ech}} deployment. If you don't have one yet, refer to [](/solutions/search/set-up/choose-a-deployment-type.md). +* You need access to your deployment or project, such as an {{es}} {{vectordb}} project, an {{es}} project, or an {{ech}} deployment. If you don't have one yet, refer to [](/solutions/search/set-up/get-elasticsearch-running-for-search.md). * To create an API key, you need the `manage_api_key` or the `manage_own_api_key` cluster privilege. If you created the deployment or project, you already have this privilege. If you sign in as a different user, an administrator needs to grant it. In this case, refer to [](/deploy-manage/users-roles.md). -:::::::::{stepper} - -::::::::{step} Find your {{es}} endpoint -:anchor: find-your-elasticsearch-endpoint +## Find your {{es}} endpoint [find-your-elasticsearch-endpoint] The {{es}} endpoint is the URL your client uses to send requests. Where you find it depends on your deployment type. The following steps show you where to copy it. :::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md ::: -:::::::: - -::::::::{step} Create an API key -:anchor: get-your-api-key +## Create an API key [get-your-api-key] :::{include} /solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md ::: @@ -38,13 +32,6 @@ The {{es}} endpoint is the URL your client uses to send requests. Where you find If you just created a {{serverless-short}} project, the **Getting started** {icon}`rocket` page shows a generated API key that you can copy immediately. If you have navigated away from that page, create a new API key as described above. ::: -:::::::: - -::::::::{step} Next step -:anchor: api-key-and-endpoints-next +## Next step [api-key-and-endpoints-next] After you have an endpoint and an API key, connect a language client in [](/solutions/search/set-up/connect-with-an-sdk.md). - -:::::::: - -::::::::: diff --git a/solutions/search/set-up/connect-with-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md index 0052bdf6f99..b38b0dc4da0 100644 --- a/solutions/search/set-up/connect-with-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -19,7 +19,7 @@ To get started without installing a client, you can also work with {{es}} data i You need the following: -- A running {{es}} deployment or project. If you don't have one yet, refer to [](/solutions/search/set-up/choose-a-deployment-type.md). +- A running {{es}} deployment or project. If you don't have one yet, refer to [](/solutions/search/set-up/get-elasticsearch-running-for-search.md). - The {{es}} endpoint URL, which the client uses to reach {{es}}, and an API key, which the client uses to authenticate. If you don't have them yet, refer to [](/solutions/search/set-up/api-key-and-endpoints.md). :::::::{stepper} @@ -128,7 +128,7 @@ For supported .NET versions and other requirements, refer to the [.NET client do ::::{tab-item} Java :sync: java -Add the client dependency and the runnable example's main class to the generated `build.gradle` file: +In the generated `build.gradle` file, add the client dependency to the `dependencies` block and set `mainClass` in the `application` block: ```groovy dependencies { @@ -344,7 +344,7 @@ puts es.info ```csharp var info = await es.InfoAsync(); -Console.WriteLine(info); +Console.WriteLine($"{info.ClusterName} {info.Version.Number}"); ``` :::: @@ -354,6 +354,7 @@ Console.WriteLine(info); ```java System.out.println(es.info()); +es._transport().close(); ``` :::: diff --git a/solutions/search/set-up/choose-a-deployment-type.md b/solutions/search/set-up/get-elasticsearch-running-for-search.md similarity index 89% rename from solutions/search/set-up/choose-a-deployment-type.md rename to solutions/search/set-up/get-elasticsearch-running-for-search.md index 6ae314ee08f..49ac2f50bcb 100644 --- a/solutions/search/set-up/choose-a-deployment-type.md +++ b/solutions/search/set-up/get-elasticsearch-running-for-search.md @@ -2,14 +2,14 @@ applies_to: stack: serverless: -navigation_title: Choose a deployment type +navigation_title: Get {{es}} running description: Select an {{es}} deployment model for search, get it running, and try a search quickstart. type: overview --- -# Choose an {{es}} deployment type [choose-a-deployment-type] +# Get {{es}} running for search [get-elasticsearch-running-for-search] -{{es}} is at the core of every Elastic deployment type. The deployment type you choose determines who manages the infrastructure, scaling, and upgrades, and how usage is billed. Use this page to compare the options and find the best fit for your operational needs. +{{es}} is at the core of every Elastic deployment type. The deployment type you choose determines who manages the infrastructure, scaling, and upgrades, and how usage is billed. This page briefly introduces the deployment types you can use to get {{es}} running quickly, and points you to resources that compare them in detail. :::::{stepper} @@ -19,7 +19,6 @@ Get {{es}} running in a few minutes. ### Try for free on {{ecloud}} - * **{{serverless-full}}**: Elastic automatically scales and upgrades the project. Projects are versionless, so you always get the latest features. * **[{{es}} {{vectordb}} project](/solutions/vector-database/get-started.md)**: For most search workloads, this is the recommended option. It is optimized for vector workloads, such as [RAG](/solutions/search/rag.md), recommendations, and [multimodal search](/solutions/search/multimodal-search.md). Sign up for a [14-day free trial](https://cloud.elastic.co/registration?onboarding_token=vector). * **[{{es}} project](/solutions/elasticsearch-solution-project/get-started.md)**: If you have logs, events, time series, or telemetry data, choose this project type. Sign up for a [14-day free trial](https://cloud.elastic.co/serverless-registration). diff --git a/solutions/toc.yml b/solutions/toc.yml index 469e3a7d7c2..55c7f64622c 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -13,7 +13,7 @@ toc: - file: search/get-started/semantic-search.md - file: search/set-up.md children: - - file: search/set-up/choose-a-deployment-type.md + - file: search/set-up/get-elasticsearch-running-for-search.md - file: search/set-up/api-key-and-endpoints.md - file: search/set-up/connect-with-an-sdk.md - file: search/ingest-for-search.md From e563de7dd4d3ad174ca5c819839ae8e9c25ad82c Mon Sep 17 00:00:00 2001 From: kosabogi <105062005+kosabogi@users.noreply.github.com> Date: Mon, 26 Oct 2026 14:19:42 +0100 Subject: [PATCH 46/48] Update solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md Co-authored-by: shainaraskas <58563081+shainaraskas@users.noreply.github.com> --- .../_snippets/find-elasticsearch-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index ca14f5c748c..7ee70772589 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -104,7 +104,7 @@ When the space uses the **{{es}}** solution view, the **Getting started** page s ::::{applies-item} {"deployment": {"self": "ga"}} For a self-managed cluster, one you install and manage, your endpoint takes the form `://:`. Each part comes from your cluster's HTTP settings: -* **Scheme**: `https` when TLS is enabled on the HTTP layer, and `http` when it isn't. [Automatic security setup](/deploy-manage/security/self-auto-setup.md) enables TLS on a new archive or package installation. +* **Scheme**: `https` when TLS is enabled on the HTTP layer, and `http` when it isn't. TLS is enabled by default on first startup through [automatic security setup](/deploy-manage/security/self-auto-setup.md), unless the setup is [explicitly skipped](/deploy-manage/security/self-auto-setup.md#stack-skip-auto-configuration) or disabled, as in the local development quickstart. * **Host**: The address clients use to reach the node, set by [`http.host` or `network.host`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). * **Port**: The HTTP port, set by [`http.port`](elasticsearch://reference/elasticsearch/configuration-reference/networking-settings.md). It defaults to the range `9200-9300`, and a node binds to the first free port in that range. From f1ce3eb6fe4f220d362658eebea0ee8efed982f4 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Mon, 26 Oct 2026 16:38:16 +0100 Subject: [PATCH 47/48] Resolving comments --- .../find-endpoint-serverless-console.md | 11 +- .../_snippets/create-an-api-key.md | 8 +- .../_snippets/find-elasticsearch-endpoint.md | 35 +++-- .../search-connection-details.md | 2 +- .../images/cloud-console-hosted-endpoint.png | Bin 104358 -> 43290 bytes .../cloud-console-serverless-endpoint.png | Bin 99954 -> 31956 bytes solutions/search/set-up.md | 4 +- .../search/set-up/connect-with-an-sdk.md | 134 +++++++++++++++++- 8 files changed, 169 insertions(+), 25 deletions(-) diff --git a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md index 2d8bf09a561..37d2400298e 100644 --- a/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md +++ b/deploy-manage/deploy/elastic-cloud/_snippets/find-endpoint-serverless-console.md @@ -1,12 +1,11 @@ -1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), select **Serverless**. -2. Find your project and select **Manage**. -3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. -4. Copy the **Endpoint** value. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. +2. Under **Application endpoints**, select **{{es}}**. +3. Copy the **Direct endpoint** value. :::{image} /solutions/images/cloud-console-serverless-endpoint.png - :alt: The {{es}} panel on a Serverless project page in the {{ecloud}} Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons + :alt: The Application endpoints panel in the {{ecloud}} Console, with {{es}} expanded to show the Direct endpoint and Direct Azure Private Link endpoint :screenshot: :width: 50% ::: -If your project runs on AWS and AWS PrivateLink is set up, the panel also lists an **AWS PrivateLink endpoint**. Use it only when you connect through AWS PrivateLink. To learn more, refer to [](/deploy-manage/security/private-connectivity-aws.md). +Azure and {{aws}} also offer an endpoint you can use to connect to the deployment over a private connection. [Learn more about private connectivity](/deploy-manage/security/private-connectivity.md). diff --git a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md index 6fd40dfa403..6d0791cc855 100644 --- a/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md +++ b/solutions/elasticsearch-solution-project/_snippets/create-an-api-key.md @@ -4,6 +4,8 @@ This snippet is in use in the following locations: - solutions/search/set-up/api-key-and-endpoints.md --> +A personal API key authenticates your client with your own privileges when it sends requests to {{es}}. The following steps show you where to create one for your deployment type. + :::::{applies-switch} ::::{applies-item} serverless: ga @@ -18,6 +20,10 @@ Follow these steps to create an API key for your project. 6. Copy the key. It isn't available after you close the panel. Keys created here expire in 90 days and carry your own privileges. To set an expiration or restrict privileges, select **Manage API keys** and create the key there instead. + +:::{note} +You can also use an [{{ecloud}} API key](/deploy-manage/api-keys/elastic-cloud-api-keys.md) to access {{es}}. Use it when the same key needs to access more than one project, or when you use [{{cps}}](/deploy-manage/cross-project-search-config/cps-config-access-and-scope.md#manage-user-and-api-key-access). +::: :::: ::::{applies-item} ech: ga @@ -74,4 +80,4 @@ Keys created here don't expire unless you add an expiration date. ::::: -For key types, privileges, and expiration options, refer to [](/deploy-manage/api-keys.md). +For privileges and expiration options, refer to [](/deploy-manage/api-keys.md). diff --git a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md index 72774e61fbf..a1185d9c72a 100644 --- a/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md +++ b/solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md @@ -28,11 +28,11 @@ Copy the {{es}} endpoint for your project from the project UI or the {{ecloud}} ::::{tab-item} {{ecloud}} Console 1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. -3. Under **Application endpoints**, select **{{es}}**. -4. Copy the **Direct endpoint** value. +2. Under **Application endpoints**, select **{{es}}**. +3. Copy the **Direct endpoint** value. :::{image} /solutions/images/cloud-console-serverless-endpoint.png -:alt: The {{es}} panel on a Serverless project page in the {{ecloud}} Console, showing the Endpoint and AWS PrivateLink endpoint values with copy buttons +:alt: The Application endpoints panel in the {{ecloud}} Console, with {{es}} expanded to show the Direct endpoint and Direct Azure Private Link endpoint :screenshot: :width: 50% ::: @@ -62,16 +62,20 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co :width: 50% ::: +:::{tip} +When the space uses the **{{es}}** solution view, the **Getting started** page shows the endpoint directly. +::: + :::: ::::{tab-item} {{ecloud}} Console -1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your project and select **Manage**. -3. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. -4. Copy the **Direct endpoint** value. +1. In the [{{ecloud}} Console](https://cloud.elastic.co?page=docs&placement=docs-body), find your deployment and select **Manage**. +2. Under **Application endpoints, cluster and component IDs**, select **{{es}}**. +3. Copy the **Direct endpoint** value. :::{image} /solutions/images/cloud-console-hosted-endpoint.png -:alt: The {{es}} panel on a hosted deployment page in the {{ecloud}} Console, showing the Endpoint value with a copy button +:alt: The Application endpoints, cluster and component IDs panel in the {{ecloud}} Console, with {{es}} expanded to show the Endpoint, Direct endpoint, and Cluster ID :screenshot: :width: 50% ::: @@ -82,7 +86,12 @@ Copy the {{es}} endpoint for {{ech}} from the deployment UI or the {{ecloud}} Co :::::: -::::{applies-item} ece: ga +::::::{applies-item} ece: ga + +:::::{tab-set} + +::::{tab-item} {{kib}} + For {{ece}}, your endpoint details are in the **Connection details** panel in {{kib}}. 1. Open {{kib}} for your deployment. @@ -101,6 +110,16 @@ When the space uses the **{{es}}** solution view, the **Getting started** page s :::: +::::{tab-item} Cloud UI + +To connect to your {{es}} cluster, copy the **{{es}} endpoint** from the deployment page in the [Cloud UI](/deploy-manage/deploy/cloud-enterprise/log-into-cloud-ui.md). + +:::: + +::::: + +:::::: + ::::{applies-item} {"deployment": {"self": "ga"}} For a self-managed cluster, one you install and manage, your endpoint takes the form `://:`. Each part comes from your cluster's HTTP settings: diff --git a/solutions/elasticsearch-solution-project/search-connection-details.md b/solutions/elasticsearch-solution-project/search-connection-details.md index e9ca517ae99..e5c13fc73c1 100644 --- a/solutions/elasticsearch-solution-project/search-connection-details.md +++ b/solutions/elasticsearch-solution-project/search-connection-details.md @@ -25,7 +25,7 @@ To create an API key, you need the `manage_api_key` or the `manage_own_api_key` :::{include} /solutions/elasticsearch-solution-project/_snippets/find-elasticsearch-endpoint.md ::: -### Find your Cloud ID [find-cloud-id-cloud-self-managed] +## Find your Cloud ID [find-cloud-id-cloud-self-managed] ```{applies_to} deployment: diff --git a/solutions/images/cloud-console-hosted-endpoint.png b/solutions/images/cloud-console-hosted-endpoint.png index 980abed6af81e2274e843325857c06ec30decf5b..7bfd4da297ef1950abe4b942f3f1a5e58b1c200f 100644 GIT binary patch literal 43290 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 literal 104358 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
  • _FqCle;_;^9$s5; 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 literal 99954 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 diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index 4b5641fcc91..bbdecfee71d 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -13,6 +13,4 @@ If you're building search on {{es}}, start here. These pages take you from selec 1. [](/solutions/search/set-up/get-elasticsearch-running-for-search.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. 2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. -3. [Connect programmatically](/solutions/search/set-up/connect-with-an-sdk.md): Connect with an SDK, install a language client, and send a request from code. - -If you don't want to connect programmatically, you can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +3. [Connect programmatically](/solutions/search/set-up/connect-with-an-sdk.md): Connect with an SDK, install a language client, and send a request from code. If you don't want to connect programmatically, you can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). diff --git a/solutions/search/set-up/connect-with-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md index b38b0dc4da0..6f2fba09306 100644 --- a/solutions/search/set-up/connect-with-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -12,7 +12,7 @@ type: how-to You can use an official {{es}} client library to connect your application to {{es}} from code. This page shows how to install and initialize the client for each supported language. :::{note} -To get started without installing a client, you can also work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +To get started without installing a client, work with {{es}} data in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md), or send requests with `curl`. For `curl` examples, refer to the [{{es}} API documentation]({{es-apis}}). ::: ## Before you begin @@ -22,6 +22,10 @@ You need the following: - A running {{es}} deployment or project. If you don't have one yet, refer to [](/solutions/search/set-up/get-elasticsearch-running-for-search.md). - The {{es}} endpoint URL, which the client uses to reach {{es}}, and an API key, which the client uses to authenticate. If you don't have them yet, refer to [](/solutions/search/set-up/api-key-and-endpoints.md). +## Connect a client + +The following steps show you how to set your endpoint and API key, install a client for your language, and verify the connection. + :::::::{stepper} ::::::{step} Connect to {{es}} @@ -298,7 +302,7 @@ func main() { ::::::{step} Verify your connection :anchor: connect-with-an-sdk-verify -Call the info API to confirm that your endpoint URL and API key work. A successful response includes the cluster name and version. +Call the info API to confirm that your endpoint URL and API key work. :::::{tab-set} :group: languages @@ -375,13 +379,131 @@ log.Println(res) ::::: -:::::: +:::::{dropdown} Example responses +A successful response includes the cluster name and version. The exact output depends on your client and your deployment. + +::::{tab-set} +:group: languages -::::::{step} Next steps -:anchor: connect-with-an-sdk-next +:::{tab-item} Python +:sync: python -{{es}} is up and running, and your application is connected. Next, learn how to ingest your own data in [](/solutions/search/ingest-for-search.md). +```python +{'name': 'instance-0000000000', 'cluster_name': 'my-deployment', 'cluster_uuid': 'QIpRB53HS1KSVYWtjP_rqg', 'version': {'number': '9.2.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '25d88452371273dd27356c98598287b669a03eae', 'build_date': '2025-10-21T10:06:21.288851013Z', 'build_snapshot': False, 'lucene_version': '10.3.1', 'minimum_wire_compatibility_version': '8.19.0', 'minimum_index_compatibility_version': '8.0.0'}, 'tagline': 'You Know, for Search'} +``` + +::: + +:::{tab-item} TypeScript +:sync: typescript + +```typescript +{ + name: 'instance-0000000000', + cluster_name: 'my-deployment', + cluster_uuid: 'QIpRB53HS1KSVYWtjP_rqg', + version: { + number: '9.2.0', + build_flavor: 'default', + build_type: 'docker', + build_hash: '25d88452371273dd27356c98598287b669a03eae', + build_date: '2025-10-21T10:06:21.288851013Z', + build_snapshot: false, + lucene_version: '10.3.1', + minimum_wire_compatibility_version: '8.19.0', + minimum_index_compatibility_version: '8.0.0' + }, + tagline: 'You Know, for Search' +} +``` + +::: + +:::{tab-item} PHP +:sync: php + +```json +{ + "name" : "instance-0000000000", + "cluster_name" : "my-deployment", + "cluster_uuid" : "QIpRB53HS1KSVYWtjP_rqg", + "version" : { + "number" : "9.2.0", + "build_flavor" : "default", + "build_type" : "docker", + "build_hash" : "25d88452371273dd27356c98598287b669a03eae", + "build_date" : "2025-10-21T10:06:21.288851013Z", + "build_snapshot" : false, + "lucene_version" : "10.3.1", + "minimum_wire_compatibility_version" : "8.19.0", + "minimum_index_compatibility_version" : "8.0.0" + }, + "tagline" : "You Know, for Search" +} +``` + +::: + +:::{tab-item} Ruby +:sync: ruby + +```ruby +{"name" => "instance-0000000000", "cluster_name" => "my-deployment", "cluster_uuid" => "QIpRB53HS1KSVYWtjP_rqg", "version" => {"number" => "9.2.0", "build_flavor" => "default", "build_type" => "docker", "build_hash" => "25d88452371273dd27356c98598287b669a03eae", "build_date" => "2025-10-21T10:06:21.288851013Z", "build_snapshot" => false, "lucene_version" => "10.3.1", "minimum_wire_compatibility_version" => "8.19.0", "minimum_index_compatibility_version" => "8.0.0"}, "tagline" => "You Know, for Search"} +``` + +::: + +:::{tab-item} C#/.NET +:sync: csharp + +```text +my-deployment 9.2.0 +``` + +::: + +:::{tab-item} Java +:sync: java + +```text +InfoResponse: {"cluster_name":"my-deployment","cluster_uuid":"QIpRB53HS1KSVYWtjP_rqg","name":"instance-0000000000","tagline":"You Know, for Search","version":{"build_date":"2025-10-21T10:06:21.288851013Z","build_flavor":"default","build_hash":"25d88452371273dd27356c98598287b669a03eae","build_snapshot":false,"build_type":"docker","lucene_version":"10.3.1","minimum_index_compatibility_version":"8.0.0","minimum_wire_compatibility_version":"8.19.0","number":"9.2.0"}} +``` + +::: + +:::{tab-item} Go +:sync: go + +```text +[200 OK] { + "name" : "instance-0000000000", + "cluster_name" : "my-deployment", + "cluster_uuid" : "QIpRB53HS1KSVYWtjP_rqg", + "version" : { + "number" : "9.2.0", + "build_flavor" : "default", + "build_type" : "docker", + "build_hash" : "25d88452371273dd27356c98598287b669a03eae", + "build_date" : "2025-10-21T10:06:21.288851013Z", + "build_snapshot" : false, + "lucene_version" : "10.3.1", + "minimum_wire_compatibility_version" : "8.19.0", + "minimum_index_compatibility_version" : "8.0.0" + }, + "tagline" : "You Know, for Search" +} +``` + +::: + +:::: + +::::: :::::: ::::::: + +## Next steps [connect-with-an-sdk-next] + +{{es}} is up and running, and your application is connected. Next, learn how to ingest your own data in [](/solutions/search/ingest-for-search.md). From 5ee388f64e497a04eb79899576f09f56c2dfec75 Mon Sep 17 00:00:00 2001 From: kosabogi Date: Tue, 27 Oct 2026 08:34:50 +0100 Subject: [PATCH 48/48] Resolving comments --- solutions/search/set-up.md | 2 +- .../search/set-up/connect-with-an-sdk.md | 143 ++++++++---------- 2 files changed, 64 insertions(+), 81 deletions(-) diff --git a/solutions/search/set-up.md b/solutions/search/set-up.md index bbdecfee71d..9926c38d9aa 100644 --- a/solutions/search/set-up.md +++ b/solutions/search/set-up.md @@ -13,4 +13,4 @@ If you're building search on {{es}}, start here. These pages take you from selec 1. [](/solutions/search/set-up/get-elasticsearch-running-for-search.md): Compare fully managed and self-managed options, and select the one that fits how much infrastructure you want to run. 2. [](/solutions/search/set-up/api-key-and-endpoints.md): Find your endpoint URL and create an API key. -3. [Connect programmatically](/solutions/search/set-up/connect-with-an-sdk.md): Connect with an SDK, install a language client, and send a request from code. If you don't want to connect programmatically, you can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). +3. [](/solutions/search/set-up/connect-with-an-sdk.md): Connect programmatically, install a language client, and send a request from code. If you don't want to connect programmatically, you can also get started with {{es}} in the {{kib}} [{{dev-tools-app}} Console](/explore-analyze/query-filter/tools/console.md). diff --git a/solutions/search/set-up/connect-with-an-sdk.md b/solutions/search/set-up/connect-with-an-sdk.md index 6f2fba09306..7ab4d53ded2 100644 --- a/solutions/search/set-up/connect-with-an-sdk.md +++ b/solutions/search/set-up/connect-with-an-sdk.md @@ -28,7 +28,7 @@ The following steps show you how to set your endpoint and API key, install a cli :::::::{stepper} -::::::{step} Connect to {{es}} +::::::{step} Set environment variables :anchor: connect-with-an-sdk-connect Set your {{es}} endpoint and API key as environment variables: @@ -302,7 +302,7 @@ func main() { ::::::{step} Verify your connection :anchor: connect-with-an-sdk-verify -Call the info API to confirm that your endpoint URL and API key work. +Call the info API to confirm that your endpoint URL and API key work. A successful response includes the cluster name and version. The exact output depends on your client and your deployment. :::::{tab-set} :group: languages @@ -314,88 +314,24 @@ Call the info API to confirm that your endpoint URL and API key work. print(es.info()) ``` -:::: - -::::{tab-item} TypeScript -:sync: typescript - -```typescript -console.log(await es.info()); -``` - -:::: - -::::{tab-item} PHP -:sync: php - -```php -echo $es->info()->asString(); -``` - -:::: - -::::{tab-item} Ruby -:sync: ruby - -```ruby -puts es.info -``` - -:::: - -::::{tab-item} C#/.NET -:sync: csharp +:::{dropdown} Example response -```csharp -var info = await es.InfoAsync(); -Console.WriteLine($"{info.ClusterName} {info.Version.Number}"); -``` - -:::: - -::::{tab-item} Java -:sync: java - -```java -System.out.println(es.info()); -es._transport().close(); +```python +{'name': 'instance-0000000000', 'cluster_name': 'my-deployment', 'cluster_uuid': 'QIpRB53HS1KSVYWtjP_rqg', 'version': {'number': '9.2.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '25d88452371273dd27356c98598287b669a03eae', 'build_date': '2025-10-21T10:06:21.288851013Z', 'build_snapshot': False, 'lucene_version': '10.3.1', 'minimum_wire_compatibility_version': '8.19.0', 'minimum_index_compatibility_version': '8.0.0'}, 'tagline': 'You Know, for Search'} ``` -:::: - -::::{tab-item} Go -:sync: go - -```go -res, err := es.Info() -if err != nil { - log.Fatal(err) -} -defer res.Body.Close() -log.Println(res) -``` +::: :::: -::::: - -:::::{dropdown} Example responses -A successful response includes the cluster name and version. The exact output depends on your client and your deployment. - -::::{tab-set} -:group: languages - -:::{tab-item} Python -:sync: python +::::{tab-item} TypeScript +:sync: typescript -```python -{'name': 'instance-0000000000', 'cluster_name': 'my-deployment', 'cluster_uuid': 'QIpRB53HS1KSVYWtjP_rqg', 'version': {'number': '9.2.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '25d88452371273dd27356c98598287b669a03eae', 'build_date': '2025-10-21T10:06:21.288851013Z', 'build_snapshot': False, 'lucene_version': '10.3.1', 'minimum_wire_compatibility_version': '8.19.0', 'minimum_index_compatibility_version': '8.0.0'}, 'tagline': 'You Know, for Search'} +```typescript +console.log(await es.info()); ``` -::: - -:::{tab-item} TypeScript -:sync: typescript +:::{dropdown} Example response ```typescript { @@ -419,9 +355,17 @@ A successful response includes the cluster name and version. The exact output de ::: -:::{tab-item} PHP +:::: + +::::{tab-item} PHP :sync: php +```php +echo $es->info()->asString(); +``` + +:::{dropdown} Example response + ```json { "name" : "instance-0000000000", @@ -444,36 +388,75 @@ A successful response includes the cluster name and version. The exact output de ::: -:::{tab-item} Ruby +:::: + +::::{tab-item} Ruby :sync: ruby +```ruby +puts es.info +``` + +:::{dropdown} Example response + ```ruby {"name" => "instance-0000000000", "cluster_name" => "my-deployment", "cluster_uuid" => "QIpRB53HS1KSVYWtjP_rqg", "version" => {"number" => "9.2.0", "build_flavor" => "default", "build_type" => "docker", "build_hash" => "25d88452371273dd27356c98598287b669a03eae", "build_date" => "2025-10-21T10:06:21.288851013Z", "build_snapshot" => false, "lucene_version" => "10.3.1", "minimum_wire_compatibility_version" => "8.19.0", "minimum_index_compatibility_version" => "8.0.0"}, "tagline" => "You Know, for Search"} ``` ::: -:::{tab-item} C#/.NET +:::: + +::::{tab-item} C#/.NET :sync: csharp +```csharp +var info = await es.InfoAsync(); +Console.WriteLine($"{info.ClusterName} {info.Version.Number}"); +``` + +:::{dropdown} Example response + ```text my-deployment 9.2.0 ``` ::: -:::{tab-item} Java +:::: + +::::{tab-item} Java :sync: java +```java +System.out.println(es.info()); +es._transport().close(); +``` + +:::{dropdown} Example response + ```text InfoResponse: {"cluster_name":"my-deployment","cluster_uuid":"QIpRB53HS1KSVYWtjP_rqg","name":"instance-0000000000","tagline":"You Know, for Search","version":{"build_date":"2025-10-21T10:06:21.288851013Z","build_flavor":"default","build_hash":"25d88452371273dd27356c98598287b669a03eae","build_snapshot":false,"build_type":"docker","lucene_version":"10.3.1","minimum_index_compatibility_version":"8.0.0","minimum_wire_compatibility_version":"8.19.0","number":"9.2.0"}} ``` ::: -:::{tab-item} Go +:::: + +::::{tab-item} Go :sync: go +```go +res, err := es.Info() +if err != nil { + log.Fatal(err) +} +defer res.Body.Close() +log.Println(res) +``` + +:::{dropdown} Example response + ```text [200 OK] { "name" : "instance-0000000000",