When I am updating the single String in painless, its working fine. But when updating List in painless is not working.
Any help would be appreciated.
Regards
When I am updating the single String in painless, its working fine. But when updating List in painless is not working.
Any help would be appreciated.
Regards
Can you show a simple script that reproduces the issue?
Both of the below scripts are not working.
String scriptAdd = "List addValues = params.add_list; ctx._source.labels.addAll(addValues);";
String scriptRemove = "List removeValues = params.remove_list; ctx._source.labels.removeAll(removeValues);";
Could you modify this script to reproduce the issue. It seem to work for me:
DELETE test
PUT test/doc/1
{
"labels": ["0"]
}
POST test/_search
{
"query": {
"match_all": {}
},
"script_fields": {
"test": {
"script": {
"inline": "List addValues = params.add_list; ctx._source.labels.addAll(addValues);",
"params": {
"add_list": ["1", "2", "3"]
}
}
}
}
}
POST test/doc/1/_update
{
"script": {
"inline": "List addValues = params.add_list; ctx._source.labels.addAll(addValues);",
"params": {
"add_list": [
"1",
"2",
"3"
]
}
}
}
GET test/doc/1
It returns
{
"_index": "test",
"_type": "doc",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"labels": [
"0",
"1",
"2",
"3"
]
}
}
Thanks for your reply.
What you sent is working fine in HTTP API of elastic search.
Even below code is working fine
POST test/doc/1/_update
{
"script": {
"inline": "List addValues = params.add_list; for(int i=0; i < addValues.size(); i++) { if(!ctx._source.labels.contains(addValues.get(i))) ctx._source.labels.add(addValues.get(i)); }",
"params": {
"add_list": [
"1",
"2",
"3"
]
}
}
}
But I am using JAVA high level API for Elastic search . I think problem is in JAVA API
String code = "def addValues = params.add_list; ctx._source.labels.addAll(addValues);";
Working perfectly fine
Script{type=inline, lang='painless', idOrCode=' ArrayList addValues = params.add_list; for(int i=0;i<addValues.size();i++) {if(!ctx._source.labels.contains(addValues.get(i)) ctx._source.labels.add(addValues.get(i));}', options={}, params={remove_list=[Label 1, Item 2, multiple, sent, trash], add_list=[ss_label2, ss_label4, ne_label1, ss_label3, inbox]}}
Exception::>
ElasticsearchStatusException[Elasticsearch exception [type=script_exception, reason=compile error]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=invalid sequence of tokens near ['<'].]]; nested: ElasticsearchException[Elasticsearch exception [type=no_viable_alt_exception, reason=null]];
Exception::>
ElasticsearchStatusException[Elasticsearch exception [type=script_exception, reason=compile error]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=invalid sequence of tokens near ['<'].]]; nested: ElasticsearchException[Elasticsearch exception [type=no_viable_alt_exception, reason=null]];
Exception::>
ElasticsearchStatusException[Elasticsearch exception [type=script_exception, reason=compile error]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=unexpected token ['ctx'] was expecting one of [')'].]];
I cannot reproduce the issue for 2 and 3, but in all of them you are missing closing ')' in the if
statement.
def addValues = params.add_list;
for(int i=0;i<addValues.size();i++) {
if(!ctx._source.labels.contains(addValues.get(i)) <--- Missing ')'
ctx._source.labels.add(addValues.get(i));
}
Thanks for your reply,
But below script is not working. Please let me know the solution:
code = "ctx._source.attachments.add([" +
""attachmentId" : params.attachmentId," +
""size" : params.size," +
""type" : params.type," +
""file_name" : params.file_name" +
"]);";
Following below link:
Below is working fine:
{
"script": {
"inline": "ctx._source.attachments.add(["first" : params.first, "last" : params.last]);",
"params": {
"first": "123", "last": "456"
}
}
}
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
© 2020. All Rights Reserved - Elasticsearch
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant logo are trademarks of the Apache Software Foundation in the United States and/or other countries.