правильно избегать тройных кавычек в curl - PullRequest
2 голосов
/ 28 марта 2020

У меня есть следующий запрос скручивания

curl -H "Content-Type: application/json" -X POST http://localhost:9200/_reindex\?wait_for_completion\=true -d '{"source": {"index": "analytics-prod-2019.12.30", "size":1000 }, "dest": {"index": "analytics-prod-2019.12"}, "conflicts": "proceed", "script": { "lang": "painless","source: """ctx._source.index = ctx._index; def eventData = ctx._source["event.data"]; if(eventData != null) { eventData.remove("realmDb.size"); eventData.remove("realmDb.format"); eventData.remove("realmDb.contents"); }""" } }' 

, но это не удается из-за следующей ошибки:

{"error":{"root_cause":[{"type":"x_content_parse_exception","reason":"[1:166] [script] failed to parse object"}],"type":"x_content_parse_exception","reason":"[1:166] [reindex] failed to parse field [script]","caused_by":{"type":"x_content_parse_exception","reason":"[1:166] [script] failed to parse object","caused_by":{"type":"json_parse_exception","reason":"Unexpected character ('\"' (code 34)): was expecting a colon to separate field name and value\n at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@51c48433; line: 1, column: 177]"}}},"status":400}

, если я удаляю поле script из запроса, это прекрасно работает :

curl -H "Content-Type: application/json" -X POST http://localhost:9200/_reindex\?wait_for_completion\=true -d '{"source":{"index":"analytics-prod-2019.12.30","size":1000},"dest":{"index":"test-index"},"conflicts":"proceed"}}'

с использованием пользовательского интерфейса kibana работает нормально.

Как правильно выполнить это в curl?

Ответы [ 3 ]

1 голос
/ 28 марта 2020

В вашем source отсутствует двойная кавычка: enter image description here

Исправлено:

curl -H "Content-Type: application/json" \
     -X POST http://localhost:9200/_reindex\?wait_for_completion\=true \
     -d '{"source": {"index": "analytics-prod-2019.12.30", "size":1000 }, "dest": {"index": "analytics-prod-2019.12"}, "conflicts": "proceed", "script": { "lang": "painless","source": "ctx._source.index = ctx._index; def eventData = ctx._source[\"event.data\"]; if (eventData != null) { eventData.remove(\"realmDb.size\"); eventData.remove(\"realmDb.format\"); eventData.remove(\"realmDb.contents\"); }" } }' 

Вы можете использовать одинарные кавычки, как указано @Zsolt но даже сама Кибана, нажимая кнопку «Копировать как cURL», использует экранированные двойные кавычки.

1 голос
/ 29 марта 2020

curl -XPOST "http://elasticsearch:9200/_reindex?requests_per_second=115&wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "analytics-prod-2019.12.30",
    "size": 1000
  },
  "dest": {
    "index": "analytics-prod-2019.12"
  },
  "script": {
    "lang": "painless",   
    "source": "      ctx._source.index = ctx._index;\n      def eventData = ctx._source[\"event.data\"];\n      if (eventData != null) {\n        eventData.remove(\"realmDb.size\");\n        eventData.remove(\"realmDb.format\");\n        eventData.remove(\"realmDb.contents\");\n      }"
  }
}'

должен был сбежать \"

0 голосов
/ 28 марта 2020

Используйте один " для окружения значения вашего скрипта и \u0027 для выхода из вашего скрипта Painless.

curl -H "Content-Type: application/json" -X POST http://localhost:9200/_reindex\?wait_for_completion\=true -d '
{
  "source": {
    "index": "analytics-prod-2019.12.30",
    "size": 1000
  },
  "dest": {
    "index": "analytics-prod-2019.12"
  },
  "conflicts": "proceed",
  "script": {
    "lang": "painless",
    "source": "ctx._source.index = ctx._index; def eventData = ctx._source[\u0027event.data\u0027]; if(eventData != null) { eventData.remove(\u0027realmDb.size\u0027); eventData.remove(\u0027realmDb.format\u0027); eventData.remove(\u0027realmDb.contents\u0027);"
  }
}
'

Вы также можете увидеть пример этого здесь , нажмите на ссылку Copy as cURL и просмотрите пример в этом формате.

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