Sukh
Sukh

Reputation: 361

Elasticsearch Updating / Deleting Nested

I've gone through a few examples and documentations and kind find a solution update a nested object in the this result set.

  1. I can add one (if one does not exist)
  2. I can append to it (if one does exist)
  3. Can't figure out how to delete a selected entry.

Is there a method I can use (using the php client) to add an entry if it does not exist / update an entry if it does exist / delete the second entry.

I'm inheriting this problem and am new to Elastic search.

Thanks.

    {
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
            {
                "_index": "products",
                "_type": "categories",
                "_id": "AUpRjtKZfXI7LIe9OpNx",
                "_score": 1,
                "_source": {
                    "name": "Primary",
                    "description": "Primary Category",
                    "slug": "Primary",
                    "created": "2014-12-16 00:25:22",
                    "parent": [
                        {
                            "name": "First One",
                            "description": "Test",
                            "id": "ae74ea4e2e865ed3fd60c18a06e69c65",
                            "slug": "first-one"
                        },
                        {
                            "name": "Second One",
                            "description": "Testing Again",
                            "id": "c8dbe5143c8dfd6957fa33e6cea7a0a8",
                            "slug": "second-one"
                        }
                    ]
                }
            }
        ]
    }
}

Upvotes: 2

Views: 1103

Answers (1)

Zach
Zach

Reputation: 9721

Do you want to do all three in the same operation?

Deleting the second nested object is achieved through a script which removes the second element:

PUT /products
{
  "mappings": {
    "categories": {
      "properties": {
        "parent": {
          "type": "nested", 
          "properties": {
            "name":    { "type": "string"  },
            "description": { "type": "string"  },
            "id":     { "type": "string", "index": "not_analyzed"   },
            "slug":   { "type": "string"   }
          }
        }
      }
    }
  }
}

PUT /products/categories/1
{
   "name": "Primary",
   "description": "Primary Category",
   "slug": "Primary",
   "created": "2014-12-16 00:25:22",
   "parent": [
      {
         "name": "First One",
         "description": "Test",
         "id": "ae74ea4e2e865ed3fd60c18a06e69c65",
         "slug": "first-one"
      },
      {
         "name": "Second One",
         "description": "Testing Again",
         "id": "c8dbe5143c8dfd6957fa33e6cea7a0a8",
         "slug": "second-one"
      }
   ]
}

POST /products/categories/1/_update
{
    "script" : "ctx._source.parent.remove(1)",
    "lang": "groovy"
}

GET /products/categories/1

So in PHP code (using the official PHP client), the update would look like:

$params = [
  'index' => 'products',
  'type' => 'categories',
  'id' => 1,
  'body' => [
    'script' => 'ctx._source.parent.remove(1)',
    'lang' => 'groovy'
  ]
];

$result = $client->update($params);

Upvotes: 1

Related Questions