Я пытаюсь использовать API-интерфейс reindex для создания копии набора документов.Одним из полей (uuid
) документа является UUID.Мне нужно, чтобы в скопированных документах были новые UUID для поля uuid
.
Согласно [1] и [2] метод java.util.UUID.randomUUID()
не включен в белый список для использования в безболезненных сценариях.
Вопросы:
1) Как создать безболезненный UUID?
2) Почему UUID.randomUUID()
считается небезопасной операцией?Или это просто упущение, что оно не занесено в белый список?
3) Как я могу внести белый список UUID.randomUUID()
в контекст "reindex"
?Я попытался создать свой собственный безболезненный модуль расширения / плагин для этого, основываясь на примере из [3].Проблема в том, что он работает только для контекста "SearchScript"
.Кажется, не существует эквивалента "ReindexContext"
.
Вот упрощенная версия того, что я пытаюсь:
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "product1"
},
"dest": {
"index": "product2"
},
"script": {
"source": "ctx._source.uuid = java.util.UUID.randomUUID().toString()",
"lang": "painless"
}
}
'
, которая выдает следующую ошибку:
{
"error" : {
"root_cause" : [
{
"type" : "script_exception",
"reason" : "compile error",
"script_stack" : [
"... rce.uuid = java.util.UUID.randomUUID().toString()",
" ^---- HERE"
],
"script" : "ctx._source.uuid = java.util.UUID.randomUUID().toString()",
"lang" : "painless"
}
],
"type" : "script_exception",
"reason" : "compile error",
"script_stack" : [
"... rce.uuid = java.util.UUID.randomUUID().toString()",
" ^---- HERE"
],
"script" : "ctx._source.uuid = java.util.UUID.randomUUID().toString()",
"lang" : "painless",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "method [java.util.UUID, randomUUID/0] not found"
}
},
"status" : 500
}
Я знаю, что мой подход действителен, и что вышеизложенное является безболезненной проблемой белого списка, потому что, когда я пытаюсь использовать другой метод (fromString()
), я не получаю ошибок:
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "product1"
},
"dest": {
"index": "product2"
},
"script": {
"source": "ctx._source.uuid = java.util.UUID.fromString(\u0027ad139caa-5b54-4179-b812-5015daecad1e\u0027).toString()",
"lang": "painless"
}
}
'
Ссылки:
[1] - https://discuss.elastic.co/t/generate-a-uuid-using-randomuuid-in-painless/144354/3
[2] - https://www.elastic.co/guide/en/elasticsearch/painless/6.6/painless-api-reference.html
[3] - https://github.com/elastic/elasticsearch/tree/v6.6.0/plugins/examples/painless-whitelist
Другие примечания: