2

I try to familiarize myself with the Reindexing API of ElasticSearch and the use of Painless scripts.

I have the following model:

"mappings": {
    "customer": {
        "properties": {
            "firstName": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "ignore_above": 256,
                        "type": "keyword"
                    }
                }
            },
            "lastName": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "ignore_above": 256,
                        "type": "keyword"
                    }
                }
            },
            "dateOfBirth": {
                "type": "date"
            }
        }
    }
}

I would like to reindex all documents from test-v1 to test-v2 and apply a few transformations on them (for example extract the year part of dateOfBirth, convert a date value to a timestamp, etc) and save the result as a new field. But I got an issue when I tried to access it.

When I made the following call, I got an error:

POST /_reindex?pretty=true&human=true&wait_for_completion=true HTTP/1.1
Host: localhost:9200
Content-Type: application/json

{
    "source": {
        "index": "test-v1"
    },
    "dest": {
        "index": "test-v2"
    },
    "script": {
        "lang": "painless",
        "inline": "ctx._source.yearOfBirth = ctx._source.dateOfBirth.getYear();"
    }
}

And the response:

{
"error": {
    "root_cause": [
        {
            "type": "script_exception",
            "reason": "runtime error",
            "script_stack": [
                "ctx._source.yearOfBirth = ctx._source.dateOfBirth.getYear();",
                "                                                 ^---- HERE"
            ],
            "script": "ctx._source.yearOfBirth = ctx._source.dateOfBirth.getYear();",
            "lang": "painless"
        }
    ],
    "type": "script_exception",
    "reason": "runtime error",
    "script_stack": [
        "ctx._source.yearOfBirth = ctx._source.dateOfBirth.getYear();",
        "                                                 ^---- HERE"
    ],
    "script": "ctx._source.yearOfBirth = ctx._source.dateOfBirth.getYear();",
    "lang": "painless",
    "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "Unable to find dynamic method [getYear] with [0] arguments for class [java.lang.String]."
    }
},
"status": 500
}

According to this tutorial Date fields are exposed as ReadableDateTime so they support methods like getYear, and getDayOfWeek. and indeed, the Reference mentions those as supported methods.

Still, the response mentions [java.lang.String] as the type of the dateOfBirth property. I could just parse it to e.g. an OffsetDateTime, but I wonder why it is a string.

Anyone has a suggestion what I'm doing wrong?

Peter Szekeli
  • 2,712
  • 3
  • 30
  • 44
  • 1
    The `doc.born.date.year` in example works cause there are doc values available for born field when searching and filtering. In context of update you don't get the doc values just the source. Yeah painless is causing a lot of pain. [Here](https://stackoverflow.com/a/45864252/808271) is solution for your problem. – slawek Nov 02 '17 at 20:11

0 Answers0