Link Search Menu Expand Document Documentation Menu

Rewrite

Multi-term queries like wildcard, prefix, regexp, fuzzy, and range expand internally into sets of terms. The rewrite parameter allows you to control how these term expansions are executed and scored.

When a multi-term query expands into many terms (for example, prefix: "error*" matching hundreds of terms), they are internally converted into term queries. This process can have the following drawbacks:

  • Exceed the indices.query.bool.max_clause_count limit (default is 1024).
  • Affect how scores are calculated for matching documents.
  • Impact memory and latency depending on the rewrite method used.

The rewrite parameter gives you control over how multi-term queries behave internally.

Mode Scores Performance Notes
constant_score Same score for all matches Best Default mode, ideal for filters
scoring_boolean TF/IDF-based Moderate Full relevance scoring
constant_score_boolean Same score but with Boolean structure Moderate Use with must_not or minimum_should_match
top_terms_N TF/IDF on top N terms Efficient Truncates expansion
top_terms_boost_N Static boosts Fast Less accurate
top_terms_blended_freqs_N Blended score Balanced Best scoring/efficiency trade-off

Available rewrite methods

The following table summarizes the available rewrite methods.

Rewrite method Description
constant_score (Default) All expanded terms are evaluated together as a single unit, assigning the same score to every match. Matching documents are not scored individually, making it very efficient for filtering use cases.
scoring_boolean Breaks the query into a Boolean should clause with one term query per match. Each result is scored individually based on relevance.
constant_score_boolean Similar to scoring_boolean, but all documents receive a fixed score regardless of term frequency. Maintains Boolean structure without TF/IDF weighting.
top_terms_N Restricts scoring and execution to the N most frequent terms. Reduces resource usage and prevents clause overload.
top_terms_boost_N Like top_terms_N but uses static boosting instead of full scoring. Offers performance improvements with simplified relevance.
top_terms_blended_freqs_N Chooses the top N matching terms and averages their document frequencies for scoring. Produces balanced scores without full term explosion.

Boolean-based rewrite limits

All Boolean-based rewrites, such as scoring_boolean, constant_score_boolean, and top_terms_*, are subject to the following dynamic cluster-level index settings:

indices.query.bool.max_clause_count

This setting controls the maximum number of allowed Boolean should clauses (default: 1024). If your query expands to a number of terms greater than this limit, it is rejected with a too_many_clauses error.

For example, a wildcard, such as “error*”, might expand to hundreds or thousands of matching terms, which could include “error”, “errors”, “error_log”, “error404”, and others. Each of these terms turns into a separate term query. If the number of terms exceeds the indices.query.bool.max_clause_count limit, the query fails:

POST /logs/_search
{
  "query": {
    "wildcard": {
      "message": {
        "value": "error*",
        "rewrite": "scoring_boolean"
      }
    }
  }
}

The query is expanded internally as follows:

{
  "bool": {
    "should": [
      { "term": { "message": "error" } },
      { "term": { "message": "errors" } },
      { "term": { "message": "error_log" } },
      { "term": { "message": "error404" } },
      ...
    ]
  }
}

Constant score

The default constant_score rewrite method wraps all expanded terms into a single query and skips the scoring phase entirely. This approach has the following characteristics:

  • Executes all term matches as a single bit array query.
  • Ignores scoring altogether; every document gets a _score of 1.0.
  • Fastest option; ideal for filtering.

The following example runs a wildcard query using the default constant_score rewrite method to efficiently filter documents matching the pattern warning* in the message field:

POST /logs/_search
{
  "query": {
    "wildcard": {
      "message": {
        "value": "warning*"
      }
    }
  }
}

Scoring Boolean

The scoring_boolean rewrite method breaks the expanded terms into separate term queries combined under a Boolean should clause. This approach works as follows:

  • Expands the wildcard into individual term queries inside a Boolean should clause.
  • Each document’s score reflects how many terms it matches and the terms’ frequency.

The following example uses a scoring_boolean rewrite configuration:

POST /logs/_search
{
  "query": {
    "wildcard": {
      "message": {
        "value": "warning*",
        "rewrite": "scoring_boolean"
      }
    }
  }
}

Constant score Boolean

The constant_score_boolean rewrite method uses the same Boolean structure as scoring_boolean but disables scoring, making it useful when clause logic is needed without relevance ranking. This method has the following characteristics:

  • Similar structure to scoring_boolean, but documents are not ranked.
  • All matching documents receive the same score.
  • Retains Boolean clause flexibility, such as using must_not, without ranking.

The following example query uses a must_not Boolean clause:

POST /logs/_search
{
  "query": {
    "bool": {
      "must_not": {
        "wildcard": {
          "message": {
            "value": "error*",
            "rewrite": "constant_score_boolean"
          }
        }
      }
    }
  }
}

This query is internally expanded as follows:

{
  "bool": {
    "must_not": {
      "bool": {
        "should": [
          { "term": { "message": "error" } },
          { "term": { "message": "errors" } },
          { "term": { "message": "error_log" } },
          ...
        ]
      }
    }
  }
}

Top terms N

The top_terms_N method is one of several rewrite options designed to balance scoring accuracy and performance when expanding multi-term queries. It works as follows:

  • Only the N most frequently matching terms are selected and scored.
  • Useful when you expect a large term expansion and want to limit the load.
  • Other valid terms are ignored to preserve performance.

The following query uses the top_terms_2 rewrite method to score only the two most frequent terms that match the warning* pattern in the message field:

POST /logs/_search
{
  "query": {
    "wildcard": {
      "message": {
        "value": "warning*",
        "rewrite": "top_terms_2"
      }
    }
  }
}

Top terms boost N

The top_terms_boost_N rewrite method selects the top N matching terms and applies static boost values instead of computing full relevance scores. It works as follows:

  • Limits expansion to the top N terms like top_terms_N.
  • Rather than computing TF/IDF, it assigns a preset boost to each term.
  • Provides faster execution with predictable relevance weights.

The following example uses a top_terms_boost_2 rewrite parameter:

POST /logs/_search
{
  "query": {
    "wildcard": {
      "message": {
        "value": "warning*",
        "rewrite": "top_terms_boost_2"
      }
    }
  }
}

Top terms blended frequencies N

The top_terms_blended_freqs_N rewrite method selects the top N matching terms and blends their document frequencies to produce more balanced relevance scores. This approach has the following characteristics:

  • Picks the top N matching terms and applies a blended frequency to all.
  • Blending makes scoring smoother across terms that differ in frequency.
  • Good trade-off when you want performance with realistic scoring.

The following example uses a top_terms_blended_freqs_2 rewrite parameter:

POST /logs/_search
{
  "query": {
    "wildcard": {
      "message": {
        "value": "warning*",
        "rewrite": "top_terms_blended_freqs_2"
      }
    }
  }
}

350 characters left

Have a question? .

Want to contribute? or .