quickwit-oss/quickwit · error · anyhow::Error

default search field `{default_search_field_name}` is not in

Error message

default search field `{default_search_field_name}` is not indexed

What it means

Every default search field must be indexed; searching a non-indexed field can never match. After resolving the field via `find_field_with_default`, try_from checks `is_indexed()` on the field entry and bails if it is false (e.g. a `fast`-only or stored-only field).

Source

Thrown at quickwit/quickwit-doc-mapper/src/doc_mapper/doc_mapper_impl.rs:259

        }
        validate_fields_tokenizers(&schema, &tokenizer_manager)?;

        // Resolve default search fields
        let mut default_search_field_names = Vec::new();
        for default_search_field_name in &builder.default_search_fields {
            if default_search_field_names.contains(default_search_field_name) {
                bail!(
                    "duplicated default search field: `{}`",
                    default_search_field_name
                )
            }
            let (default_search_field, _json_path) = schema
                .find_field_with_default(default_search_field_name, dynamic_field)
                .with_context(|| {
                    format!("unknown default search field `{default_search_field_name}`")
                })?;
            if !schema.get_field_entry(default_search_field).is_indexed() {
                bail!("default search field `{default_search_field_name}` is not indexed",);
            }
            default_search_field_names.push(default_search_field_name.clone());
        }

        // Resolve tag fields
        for tag_field_name in &doc_mapping.tag_fields {
            validate_tag(tag_field_name, &schema)?;
        }

        let partition_key_expr: &str = doc_mapping.partition_key.as_deref().unwrap_or("");
        let partition_key = RoutingExpr::new(partition_key_expr).with_context(|| {
            format!("failed to interpret the partition key: `{partition_key_expr}`")
        })?;

        // If valid, partition key fields should be considered as tags.
        let mut tag_field_names = doc_mapping.tag_fields;

        for partition_key in partition_key.field_names() {

View on GitHub (pinned to a39730c5cd)

Solutions

  1. Set `indexed: true` on the field's mapping options.
  2. Remove the field from `default_search_fields`.
  3. Pick a different, indexed field as the default search field.

Example fix

# before
field_mappings:
  - name: payload
    type: bytes
    stored: true
default_search_fields: [payload]

# after
default_search_fields: [message]
Defensive patterns

Strategy: validation

Validate before calling

fn check_default_search_fields_indexed(cfg: &serde_yaml::Value) -> Result<(), String> {
    let fields: Vec<&str> = cfg["doc_mapping"]["field_mappings"]
        .as_sequence().map(|s| s.iter().collect()).unwrap_or_default();
    if let Some(dsfs) = cfg["doc_mapping"]["default_search_fields"].as_sequence() {
        for dsf in dsfs {
            let name = dsf.as_str().unwrap_or_default();
            let fm = fields.iter().find(|f| f["name"].as_str() == Some(name));
            if let Some(fm) = fm {
                if fm.get("indexed").and_then(|v| v.as_bool()) == Some(false) {
                    return Err(format!("default search field `{name}` is not indexed"));
                }
            }
        }
    }
    Ok(())
}

Try / catch

if let Err(e) = QuickwitDocMapper::try_from(&index_config) {
    if e.to_string().contains("is not indexed") {
        eprintln!("Enable indexing or drop this default_search_field: {e}");
    }
    return Err(e);
}

Prevention

When it happens

Trigger: `QuickwitDocMapper::try_from` where `doc_mapping.default_search_fields` names a field whose mapping has `indexed: false` (or only aggregation/fast options and no indexing).

Common situations: Adding an aggregations-only numeric field or a stored-only field to default_search_fields, or flipping `indexed: false` on a field that is still listed as a default search field.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08). Data as JSON: /api/errors/978342d277c52f6d. Report an issue: GitHub.