How to create and add nested object into nested field in Elasticsearch?
Asked Answered
M

2

11

https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html

Consider:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "user": {
          "type": "nested" 
        }
      }
    }
  }
}

PUT my_index/_doc/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

When I run a painless script like:

ctx._source.user.add({
    "first" : "Foo",
    "last" : "Bar"
})

It is not working. I tried but cannot find any related documents or discussion started by other.

Molecular answered 20/3, 2018 at 6:30 Comment(0)
M
16

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/modules-scripting-painless-syntax.html#painless-maps

You can create a map like ['first': 'Foo', 'last': 'Bar', 'sthElse': 100] then add it.

So:

ctx._source.user.add([
    "first" : "Foo",
    "last" : "Bar"
])

Please note that map in painless can be mixed type.

Molecular answered 20/3, 2018 at 6:56 Comment(0)
N
5
POST my_index/_doc/1/_update
{
   "script": {
      "lang": "painless",
      "inline": "ctx._source.user.add(params.object)",
      "params": {
         "object": {
            "first" : "Foo",
            "last" : "Bar"
         }
      }
   }
}
Nonjoinder answered 20/3, 2018 at 7:32 Comment(4)
No I need to create my nested object dynamically.Molecular
Please elaborate what you want to do.Nonjoinder
I have solution already as mentioned below. https://mcmap.net/q/975280/-how-to-create-and-add-nested-object-into-nested-field-in-elasticsearchMolecular
I like this. Could my params.object be a JsonData.of(myObject) where myObject is a Java record, for example?Garbage

© 2022 - 2025 — McMap. All rights reserved.