elastic / elasticsearch

Free and Open Source, Distributed, RESTful Search Engine
https://www.elastic.co/products/elasticsearch
Other
69.62k stars 24.64k forks source link

copy_to logic fails when used to copy value from object with dynamic: "strict" to a dynamicly mapped field #113049

Open lkts opened 5 days ago

lkts commented 5 days ago

Elasticsearch Version

8.16

Installed Plugins

No response

Java Version

bundled

OS Version

x

Problem Description

When copy_to values are parsed, we create a custom context via createCopyToContext. This context preserves the dynamic value from parent context which is wrong. That value is for the field that is a source of the copy, not the destination. As a result, when copy_to destination is a dynamically mapped field and https://github.com/elastic/elasticsearch/blob/45306a52c240ef153d2dcea8b8d36c2ab8ecc313/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java#L533 is called, it throws an exception that is wrong.

Steps to Reproduce

PUT my-index
{
  "mappings": {
    "properties": {
      "copy_source": {
        "dynamic": "strict",
        "properties": {
          "k": {
            "type": "keyword",
            "copy_to": "dest"
          }
        }
      }
    }
  }
}

POST my-index/_bulk?refresh
{ "create": {} }
{ "copy_source": { "k": "let's copy" } }

// Results in this which is wrong
"error": {
    "type": "strict_dynamic_mapping_exception",
    "reason": "[1:25] mapping set to strict, dynamic introduction of [dest] within [_doc] is not allowed"
}

Logs (if relevant)

No response

elasticsearchmachine commented 5 days ago

Pinging @elastic/es-storage-engine (Team:StorageEngine)

elasticsearchmachine commented 5 days ago

Pinging @elastic/es-search-foundations (Team:Search Foundations)

lkts commented 5 days ago

Related to #112966 and #112919.