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

duplicated default search field: `{}`

Error message

duplicated default search field: `{}`

What it means

During default-search-field resolution, each name in `builder.default_search_fields` is checked against a list of names already processed. Duplicated default search field entries are rejected because the same field would be searched redundantly and it usually signals a config mistake.

Source

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

                        tokenizer_config_entry.name,
                        error
                    )
                })?;
            let does_lowercasing = tokenizer_config_entry
                .config
                .filters
                .iter()
                .any(|filter| matches!(filter, crate::TokenFilterType::LowerCaser));
            tokenizer_manager.register(&tokenizer_config_entry.name, tokenizer, does_lowercasing);
            custom_tokenizer_names.insert(&tokenizer_config_entry.name);
        }
        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)?;

View on GitHub (pinned to a39730c5cd)

Solutions

  1. Remove the duplicate entry from `default_search_fields` in the index config.
  2. Check for near-duplicates like `my_field` and a JSON subpath variant that resolves to the same name.

Example fix

# before
default_search_fields: [message, message]

# after
default_search_fields: [message]
Defensive patterns

Strategy: validation

Validate before calling

fn check_dup_default_search_fields(cfg: &serde_yaml::Value) -> Result<(), String> {
    let mut seen = std::collections::HashSet::new();
    if let Some(fields) = cfg["doc_mapping"]["default_search_fields"].as_sequence() {
        for f in fields {
            let name = f.as_str().unwrap_or_default();
            if !seen.insert(name) {
                return Err(format!("duplicated default search field: {name}"));
            }
        }
    }
    Ok(())
}

Try / catch

match QuickwitDocMapper::try_from(&index_config) {
    Ok(m) => m,
    Err(e) if e.to_string().contains("duplicated default search field") => {
        eprintln!("De-duplicate doc_mapping.default_search_fields: {e}");
        return Err(e);
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: `QuickwitDocMapper::try_from` where `default_search_fields` (built from `doc_mapping.default_search_fields`) contains the same field name twice.

Common situations: Listing both a field and its subpath, or duplicate YAML list entries after merging configs / editing by hand.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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