Как сгенерировать UUID в Elasticsearch, переиндексация безболезненного скрипта - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать 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

Другие примечания:

Ответы [ 3 ]

0 голосов
/ 06 августа 2019

Самый простой подход - использовать самописную функцию, вот моя.Конечно, это просто обходной путь, но он должен помочь в большинстве случаев.

String generateUUID(boolean addDashes, boolean upperCase) {
    def chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];

    def dashIndices = [7, 11, 15, 19];

    def sb = new StringBuilder();

    def r = new Random();

    for (def pos = 0; pos < 32; pos += 1) {
       sb.append(chars[r.nextInt(16)]);

       if (addDashes && dashIndices.contains(pos)) {
         sb.append('-');
       }
    }

    def result = sb.toString();

    return upperCase ? result.toUpperCase() : result;
}

Скопируйте его в свой скрипт, и ниже вы сможете получить UUID, вызвав, например, generateUUID(true, false), если вынужен UUID с тире и в нижнем регистре.

0 голосов
/ 06 августа 2019

Мой запрос на решение этой проблемы был принят и реализован здесь: https://github.com/elastic/elasticsearch/issues/39080

0 голосов
/ 21 февраля 2019
You can simply do the following,

curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "product1"`enter code here`
  },
  "dest": {
    "index": "product2"
  },
  "script": {
    "source": "ctx._id=ctx._id+1",
    "lang": "painless"
  }
}
'
ctx._id = will always give you a new id and plus 1 will generate the new one.

это просто решение для получения уникального идентификатора путем добавления суффикса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...