{"record":{"id":"a4a6e8bf1ecfff0b","repo":"quickwit-oss/quickwit","slug":"dynamic-mapping-is-only-allowed-with-mode-dynami","errorCode":null,"errorMessage":"`dynamic_mapping` is only allowed with mode=dynamic. (here mode=`{:?}`)","messagePattern":"`dynamic_mapping` is only allowed with mode=dynamic\\. \\(here mode=`(.+?)`\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-doc-mapper/src/doc_mapping.rs","lineNumber":69,"sourceCode":"    pub fn mode_type(&self) -> ModeType {\n        match self {\n            Self::Lenient => ModeType::Lenient,\n            Self::Strict => ModeType::Strict,\n            Self::Dynamic(_) => ModeType::Dynamic,\n        }\n    }\n\n    /// Builds a [`Mode`] from its type and optional dynamic mapping options.\n    pub fn from_parts(\n        mode: ModeType,\n        dynamic_mapping: Option<QuickwitJsonOptions>,\n    ) -> anyhow::Result<Mode> {\n        Ok(match (mode, dynamic_mapping) {\n            (ModeType::Lenient, None) => Self::Lenient,\n            (ModeType::Strict, None) => Self::Strict,\n            (ModeType::Dynamic, Some(dynamic_mapping)) => Self::Dynamic(dynamic_mapping),\n            (ModeType::Dynamic, None) => Self::default(), // Dynamic with default options\n            (_, Some(_)) => anyhow::bail!(\n                \"`dynamic_mapping` is only allowed with mode=dynamic. (here mode=`{:?}`)\",\n                mode\n            ),\n        })\n    }\n\n    /// Obtains the mode type and dynamic options from a [`Mode`].\n    pub fn into_parts(self) -> (ModeType, Option<QuickwitJsonOptions>) {\n        match self {\n            Self::Lenient => (ModeType::Lenient, None),\n            Self::Strict => (ModeType::Strict, None),\n            Self::Dynamic(json_options) => (ModeType::Dynamic, Some(json_options)),\n        }\n    }\n}\n\nimpl Default for Mode {\n    fn default() -> Self {","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-doc-mapper/src/doc_mapping.rs#L51-L87","documentation":"Mode::from_parts rejects a config that sets a `dynamic_mapping` while `mode` is not `dynamic`. The dynamic_mapping options only have meaning in dynamic mode; pairing them with lenient or strict mode is treated as a configuration contradiction.","triggerScenarios":"DocMapping config with `mode: strict` (or lenient) plus a `dynamic_mapping:` block, parsed via Mode::from_parts during index config deserialization/validation.","commonSituations":"Copy-pasted index configs where mode was switched to strict but dynamic_mapping options were left behind; tooling that always emits a dynamic_mapping default block regardless of mode.","solutions":["Remove the dynamic_mapping block if the intended mode is strict or lenient.","Or set mode: dynamic if dynamic indexing options are actually desired.","Update config-generation tooling to emit dynamic_mapping only for mode=dynamic."],"exampleFix":"// before\nmode: strict\ndynamic_mapping:\n  by_field_name:\n    foo: {type: text}\n// after\nmode: strict","handlingStrategy":"validation","validationCode":"if mode != \"dynamic\" && config.get(\"dynamic_mapping\").is_some() {\n    return Err(\"dynamic_mapping requires mode=dynamic\".into());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Emit dynamic_mapping in generated configs only when mode is dynamic.","Remove leftover dynamic_mapping blocks when switching modes.","Validate index configs with `quickwit index create --dry-run` style checks in CI."],"tags":["index-config","config-validation","mode"],"backgroundTag":"conflicting-config-options","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}