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
- Remove the duplicate entry from `default_search_fields` in the index config.
- 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
- De-duplicate the default_search_fields list before writing it to config.
- When merging configs programmatically, use a set union instead of concatenation.
- Watch for near-duplicates that resolve to the same field path.
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
- duplicated custom tokenizer: `{}`
- default search field `{default_search_field_name}` is not in
- {left:?} storage config is defined multiple times
- Facet are not supported in quickwit yet.
- index ID pattern `{pattern}` is invalid: patterns must not c
AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08).
Data as JSON: /api/errors/88d3d15acc52aa8c.
Report an issue: GitHub.