Official agent skill

Elasticsearch Query Optimization

by elastic in elastic/agent-skills

Diagnose slow Elasticsearch Query DSL searches and propose measured fixes.

OfficialApache-2.0Auto-check passedBackend & APIs

Install Elasticsearch Query Optimization

skills CLI
$ npx skills add elastic/agent-skills --skill elasticsearch-query-optimization -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install elastic/agent-skills elasticsearch-query-optimization --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/elastic/agent-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/elasticsearch/elasticsearch-query-optimization .claude/skills/elasticsearch-query-optimization && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
elasticsearch-query-optimization
GitHub stars
592
Token cost
~2.8k tokens
SKILL.md length
1,200 words
Files
2 (incl. references)
Skills in repo
26
Repo updated
First seen
Licence
Apache-2.0

At a glance

Diagnose slow Elasticsearch Query DSL searches and propose measured fixes.

  • Works in 6 steps: Confirm connectivity and locate the… → Profile the slow query to find the… → Inspect field mappings before rewriting.… → …
  • A search is slow
  • SKILL.md covers Environment Configuration, Process, Guidelines and Examples, plus 1 more section
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Elasticsearch Query Optimization is an agent skill from elastic/agent-skills, published by the product's own GitHub organization. Diagnose slow Elasticsearch Query DSL searches and propose measured fixes. Use when a search is slow, profile output shows an expensive clause, exact-match filters sit in scoring context, or leading wildcards dominate latency. Ground every recommendation in search profiling — move non-scoring clauses to filter context, eliminate leading wildcards, and re-profile to confirm improvement.

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/query-optimization-reference.md`). Compatibility notes: Elasticsearch 8.x or 9.x, self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless; relies on the search profiling API available on all deployment…

It sits in Backend & APIs, covering Search implementation and Query optimization. It works with Elasticsearch. The repository describes itself as: Official Elastic Skills. The licence is Apache-2.0.

When your agent uses it

  • A search is slow
  • Profile output shows an expensive clause
  • Exact-match filters sit in scoring context
  • Leading wildcards dominate latency

Example prompts

  • “/elasticsearch-query-optimization”

Requirements

  • Compatibility (from SKILL.md): Elasticsearch 8.x or 9.x, self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless; relies on the search profiling API available on all deployment types. Requires the `elastic` CLI ≥ 0.2 with `stack es` support.

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Confirm connectivity and locate the target index. Call GET /. If the call fails, stop — do not guess endpoints
  2. Profile the slow query to find the dominant cost. Call POST /{index}/_search with "profile": true and the
  3. Inspect field mappings before rewriting. Call GET /{index}/_mapping. For every clause you will move or rewrite,
  4. Rewrite the query to remove the profiled bottleneck.
  5. Re-profile the rewritten query and compare. Call POST /{index}/_search again with "profile": true and the
  6. Report findings in this order.

What it can do on your machine

Read from SKILL.md and the folder at commit baa5111. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Elasticsearch 8.x or 9.x, self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless; relies on the search profiling API available on all deployment types. Requires the `elastic` CLI ≥ 0.2 with `stack es` support.

    From compatibility in the SKILL.md frontmatter.

Context cost

Elasticsearch Query Optimization loads about 2.8k tokens when it runs, and up to ~4.1k if it reads all its reference files. Until then it costs about 105 tokens; SKILL.md has 1,200 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~105
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from elastic/agent-skills at commit baa5111, republished under its Apache-2.0 licence (© elastic). 1,200 words, ~2,824 tokens.

Download SKILL.mdSave it as .claude/skills/elasticsearch-query-optimization/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
elasticsearch-query-optimization
description
Diagnose slow Elasticsearch Query DSL searches and propose measured fixes. Use when a search is slow, profile output shows an expensive clause, exact-match filters sit in scoring context, or leading wildcards dominate latency. Ground every recommendation in search profiling — move non-scoring clauses to filter context, eliminate leading wildcards, and re-profile to confirm improvement.
compatibility
Elasticsearch 8.x or 9.x, self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless; relies on the search profiling API available on all deployment types. Requires the `elastic` CLI ≥ 0.2 with `stack es` support.
metadata.author
elastic
metadata.version
0.1.0
metadata.universal
true

Elasticsearch Query DSL Optimization

Diagnose why a Query DSL search is slow, identify the dominant cost from the profile (not guesswork), rewrite the query to remove that cost while preserving match semantics, and re-measure with profiling enabled.

<!-- begin-partial: preamble -->

Environment Configuration

This skill executes Elasticsearch operations through the elastic CLI. If the elastic CLI is not installed, tell the user what it is needed for. Do not guess credentials, call the HTTP API directly, or attempt other workarounds.

This skill references operations in HTTP-shorthand form (e.g., GET /, GET /_cat/indices, GET /{index}/_mapping, GET /{index}/_settings/index.mode, POST /_query). The Operations table at the end of this document maps each shorthand to the equivalent elastic CLI command — always use the CLI rather than calling the HTTP API directly.

<!-- end-partial: preamble -->

Scope: Query DSL searches via POST /{index}/_search. This skill does not migrate queries to ES|QL — it optimizes the existing bool/match/term/wildcard structure the user already runs.

Ground rule: Never recommend "add shards" or "scale hardware" as the primary fix when the profile names a specific clause (for example WildcardQuery at ~3.8s). Fix the query first; infrastructure changes require evidence the query is already optimal.

Process

  1. Confirm connectivity and locate the target index. Call GET /. If the call fails, stop — do not guess endpoints or credentials. When the user names an index pattern (for example logs-*), narrow candidates with GET /_cat/indices and pick the index or pattern the query actually targets.

    Decision: proceed only when the index is known. Data needed: index name or pattern, and the slow Query DSL body (from the user or from a saved search).

  2. Profile the slow query to find the dominant cost. Call POST /{index}/_search with "profile": true and the user's query unchanged. Read took, then inspect profile.shards[].searches[].query — sort child collectors by time_in_nanos and identify the top contributor.

    Decision: classify the bottleneck from profile evidence:

    • TermQuery / PointRangeQuery / MatchNoDocsQuery inside must alongside a scoring clause — exact-match or range filters are being scored unnecessarily. Likely fix: move them to filter context (step 4a).
    • WildcardQuery with a leading * (for example message:*timeout*) — cannot use the inverted index; scans terms per document. Likely fix: remove the leading wildcard (step 4b).
    • MatchQuery on a text field — expected scoring cost; optimize only if profile shows it dominates after filter-context fixes.
    • High aggregation time — separate from query tuning; profile the agg tree (out of scope unless the user asked about aggs).

    Data needed: profile tree with type, description, time_in_nanos, and breakdown (especially next_doc for wildcards). Quote the top contributor verbatim when explaining the diagnosis.

  3. Inspect field mappings before rewriting. Call GET /{index}/_mapping. For every clause you will move or rewrite, confirm the field type:

    • term / terms / filter on exact values — field must be keyword (or another non-analyzed type). A term on a text field is a common bug; if types are wrong, say so and suggest the correct sub-field (for example service.keyword) or a mapping change — do not silently rewrite.
    • match / match_phrase — target a text field (analyzed).
    • wildcard — works on keyword or wildcard types; leading * still forces a scan regardless of type.

    Decision: only propose rewrites that match confirmed types. Data needed: mapping for each field referenced in the query.

  4. Rewrite the query to remove the profiled bottleneck.

    4a. Move non-scoring clauses from must to filter

    When exact-match term/terms/range/match on a keyword (or other non-scoring intent) clauses sit in must alongside a full-text match that should drive relevance:

    • Move exact-match clauses into bool.filter (or a filter array entry).
    • Keep only clauses that must affect _score in bool.must (typically the full-text match).

    Why: filter context skips scoring and participates in the filter/bitset cache on repeated queries. Semantics: the same documents match; only scoring and performance change — state this explicitly.

    Example rewrite pattern:

    json
    {
      "query": {
        "bool": {
          "filter": [{ "term": { "status": "active" } }, { "term": { "tenant_id": "acme" } }],
          "must": [{ "match": { "description": "wireless keyboard" } }]
        }
      }
    }
    4b. Eliminate leading wildcards

    When the profile shows WildcardQuery with description like message:*timeout* and high next_doc time, the leading * prevents index lookup. Choose a fix based on mapping and user intent (substring vs prefix vs exact):

    IntentPreferred rewrite
    Full-text substring in logsmatch or match_phrase on the analyzed message text field
    Literal substring on keywordwildcard-typed field, or reindex with ngram analyzer
    Prefix only (timeout*)prefix query on keyword, or edge ngram at index time

    Also move any non-scoring exact match (for example { "match": { "service": "checkout" } } on a keyword) into filter — use term on the keyword field when the mapping confirms it.

    Example rewrite pattern:

    json
    {
      "query": {
        "bool": {
          "filter": [{ "term": { "service.keyword": "checkout" } }],
          "must": [{ "match": { "message": "timeout" } }]
        }
      }
    }

    Adjust field names (service vs service.keyword) to match the mapping from step 3.

    4c. Optional — validate rewrite before profiling

    When semantics are uncertain (for example changing wildcard to match may include analyzed tokens the wildcard excluded), call POST /{index}/_validate/query?explain=true with the rewritten query and read the explanation for obvious mismatches.

    Decision: pick the smallest rewrite that addresses the profiled cost. Data needed: rewritten Query DSL body.

  5. Re-profile the rewritten query and compare. Call POST /{index}/_search again with "profile": true and the rewritten query. Compare took and the top profile collector to the baseline from step 2.

    Decision: report success only when the dominant collector changed or time_in_nanos dropped materially. If the profile still shows a leading wildcard or scored filters, iterate — do not declare victory from took alone without profile confirmation.

    Data needed: before/after profile summaries (top collector type, description, time_in_nanos).

  6. Report findings in this order.

    1. Root cause — quote the profile (for example "WildcardQuery message:*timeout* ≈ 3.8s, mostly next_doc").
    2. Rewrite — show the optimized bool structure with filter vs must separation.
    3. Mapping notes — keyword vs text confirmations from GET /{index}/_mapping.
    4. Measured improvement — before/after profile or took from step 5.
    5. Semantic caveat — only if the rewrite could change which documents match (for example match vs substring wildcard).
Show full SKILL.md (270 more words)Show less

Guidelines

  • Profile first. If the user supplies a profile summary, use it — but still recommend re-profiling after changes.
  • Filter is for equality, must is for relevance. Status, tenant ID, service name, and time ranges rarely belong in must when a text query drives ranking.
  • Leading wildcards are almost never the right fix for log search. Prefer analyzed match/match_phrase; reserve wildcard for suffix patterns (timeout*) on keyword or wildcard-typed fields.
  • Do not conflate slow with wrong. A slow query can return correct results; optimization preserves the result set unless you explicitly warn about a semantic trade-off.
  • Deep reference: profile collector types, filter-cache behavior, and wildcard alternatives — references/query-optimization-reference.md.

Examples

Unscored terms in must

Input: bool.must contains term on status, term on tenant_id, and match on description.

Diagnosis: profile shows scored TermQuery collectors alongside MatchQuery; exact filters do not need scoring.

Fix: move both term clauses to filter; keep match in must. Confirm status and tenant_id are keyword.

Leading wildcard dominates latency

Input: wildcard message:*timeout* plus match on service in must. Profile: WildcardQuery ~3.8s.

Diagnosis: leading * forces term enumeration; not an index/shard problem.

Fix: match on analyzed message; move service to filter as term on keyword. Re-profile — expect WildcardQuery to disappear or shrink to negligible time.

Operations

HTTP API (shorthand)elastic CLI command
GET /elastic es info
GET /_cat/indiceselastic es cat indices --index '<pattern>'
GET /{index}/_mappingelastic es indices get-mapping --index '<index>'
POST /{index}/_searchelastic es search --index '<index>' --input-file '<search-body.json>'
POST /{index}/_validate/query?explain=trueelastic es indices validate-query --index '<index>' --explain true --query '<json>'

Include "profile": true in the search JSON body (or pass --profile true) when profiling in steps 2 and 5.

© elastic, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in skills/elasticsearch/elasticsearch-query-optimization of elastic/agent-skills.

  • SKILL.md
  • references/query-optimization-reference.md

Open the folder on GitHubat commit baa5111

Compare with similar skills

Elasticsearch Query Optimization next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Elasticsearch Query Optimization compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Elasticsearch Query Optimization this skillelastic/agent-skills592—~2.8kAutomated safety check: PassApache-2.0
Elasticsearch Patternsvibeeval/vibecosystem531—~2.1kAutomated safety check: PassMIT
Product Full-Text Searchlobehub/lobehub83k—~4.1kAutomated safety check: PassCustom licence
Foundatio Repositoriesexceptionless/Exceptionless2.5k—~1.9kAutomated safety check: PassApache-2.0
Elasticsearch Authnaspectrr/deer405—~1.2kAutomated safety check: NotesMIT
Elasticsearch Authzaspectrr/deer405—~1.8kAutomated safety check: PassMIT

Similar skills

  • Elasticsearch Patterns

    vibeeval/vibecosystem

    Mapping design, query optimization, aggregation patterns, index lifecycle management, and search relevance tuning.

    531 GitHub stars~2.1k tokensUpdated 1 mo ago
    Backend & APIsAuto-check passed
  • Guides work on LobeHub's own product search: the shared search repository, provider choice, Elasticsearch mappings, change syncing and reindexing.

    83k GitHub stars~4.1k tokensUpdated today
    Backend & APIsAuto-check passed
  • Foundatio Repositories

    exceptionless/Exceptionless

    Query, aggregate, patch, or paginate Exceptionless data through its Elasticsearch repository abstractions.

    2.5k GitHub stars~1.9k tokensUpdated today
    Backend & APIsAuto-check passed
  • Elasticsearch Authn

    aspectrr/deer

    Authenticate to Elasticsearch using native, file-based, LDAP/AD, SAML, OIDC, Kerberos, JWT, or certificate realms.

    405 GitHub stars~1.2k tokensUpdated 5 mo ago
    Backend & APIsAuto-check: notes
  • Elasticsearch Authz

    aspectrr/deer

    Manage Elasticsearch RBAC: native users, roles, role mappings, document- and field-level security.

    405 GitHub stars~1.8k tokensUpdated 5 mo ago
    Backend & APIsAuto-check passed
  • Ingest and transform data files (CSV/JSON/Parquet/Arrow IPC) into Elasticsearch with stream processing and custom transforms.

    405 GitHub stars~684 tokensUpdated 5 mo ago
    Backend & APIsAuto-check passed

More from elastic/agent-skills

All 26 skills in this repo
  • Security Alert Triage

    elastic/agent-skills

    Official

    Triage Elastic Security alerts — gather context, classify threats, create cases, and acknowledge.

    592 GitHub starsUsed in 1 repo~3.5k tokens
    Auto-check: notes
  • Security Case Management

    elastic/agent-skills

    Official

    Create, search, update, and manage SOC cases via the Kibana Cases API.

    592 GitHub starsUsed in 1 repo~2.6k tokens
    Auto-check: notes
  • Official

    Create, tune, and manage Elastic Security detection rules (SIEM and Endpoint).

    592 GitHub starsUsed in 1 repo~3.9k tokens
    Auto-check: notes
  • Kibana Dashboards

    elastic/agent-skills

    Official

    Create and manage Kibana Dashboards and Lens visualizations.

    592 GitHub starsUsed in 1 repo~3.7k tokens
    Auto-check passed
  • Official

    Generate sample security events, attack scenarios, and synthetic alerts for Elastic Security.

    592 GitHub stars~2k tokensUpdated 5 days ago
    Auto-check passed
  • Cloud Onboarding

    elastic/agent-skills

    Official

    Onboard an Elastic Cloud organization: configure the elastic CLI's Cloud context and API key, establish a default region, then invite users, assign predefined or custom Serverless project roles, and…

    592 GitHub stars~4.1k tokensUpdated 5 days ago
    Auto-check passed

Works with

Questions about Elasticsearch Query Optimization

What does Elasticsearch Query Optimization do?

Diagnose slow Elasticsearch Query DSL searches and propose measured fixes. Elasticsearch Query Optimization is an agent skill from elastic/agent-skills, published by the product's own GitHub organization. Diagnose slow Elasticsearch Query DSL searches and propose measured fixes.

When should I use Elasticsearch Query Optimization?

Elasticsearch Query Optimization fits situations like: A search is slow; profile output shows an expensive clause; exact-match filters sit in scoring context; leading wildcards dominate latency.

How do I install Elasticsearch Query Optimization in Claude Code?

Run `npx skills add elastic/agent-skills --skill elasticsearch-query-optimization -a claude-code`. Or copy the skill folder (skills/elasticsearch/elasticsearch-query-optimization in elastic/agent-skills) into .claude/skills/elasticsearch-query-optimization in your project. Claude Code loads it when a task matches its description.

How do I install Elasticsearch Query Optimization in Codex?

Run `npx skills add elastic/agent-skills --skill elasticsearch-query-optimization -a codex`. Or copy the skill folder (skills/elasticsearch/elasticsearch-query-optimization in elastic/agent-skills) into .agents/skills/elasticsearch-query-optimization in your project. Codex loads it when a task matches its description.

Can I use Elasticsearch Query Optimization in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add elastic/agent-skills --skill elasticsearch-query-optimization -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/elasticsearch-query-optimization, .gemini/skills/elasticsearch-query-optimization, .github/skills/elasticsearch-query-optimization and .opencode/skills/elasticsearch-query-optimization in your project.

What does Elasticsearch Query Optimization need to run?

SKILL.md names no scripts, command-line tools or credentials: Elasticsearch Query Optimization is instructions for the agent only. Compatibility (from SKILL.md): Elasticsearch 8.x or 9.x, self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless; relies on the search profiling API available on all deployment types. Requires the `elastic` CLI ≥ 0.2 with `stack es` support..

Does Elasticsearch Query Optimization access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is Elasticsearch Query Optimization safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Elasticsearch Query Optimization use?

Elasticsearch Query Optimization is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Elasticsearch Query Optimization use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.3k tokens, read only when the agent opens those files.

What are the alternatives to Elasticsearch Query Optimization?

Skills that share tags, products or a category with Elasticsearch Query Optimization: Elasticsearch Patterns (vibeeval/vibecosystem, 531 stars), Product Full-Text Search (lobehub/lobehub, 83k stars), Foundatio Repositories (exceptionless/Exceptionless, 2.5k stars) and Elasticsearch Authn (aspectrr/deer, 405 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Elasticsearch Query Optimization?

elastic (a GitHub organization, an official publisher) maintains it in elastic/agent-skills, which has 592 GitHub stars. The repository holds 26 skills in this directory. The repository was last updated on October 2, 2026.

Source: elastic/agent-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.