Elasticsearch, не может удалить поле внутри вложенного поля - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть сопоставления

{
  "candidate-index" : {
    "mappings" : {
      "properties" : {
        "provider_candidates" : {
          "type" : "nested",
          "properties" : {
            "foo" : {
              "type" : "object"
            },
            "group_key" : {
              "type" : "keyword"
            }
          }
        }
      }
    }
}

Я хочу удалить foo поле

 POST /candidate-index/_update_by_query
 {
   "script" : "ctx._source.remove(\"provider_candidates.foo\")",
   "query": {
     "nested": {
       "path": "provider_candidates",
       "query": {
         "bool": {
           "must": [
             {
               "exists": {
                 "field": "provider_candidates.foo"
               }
             }
           ]


         }
       }
     }
   }
 }

Это не работает. Он не генерирует ошибку, но поле не удаляется.
Я знаю, что часть запроса верна, потому что, если я превращаю ее в _search, она правильно находит документы

Я также пытался

 POST /candidate-index/_update_by_query
 {
   "script" : "ctx._source.provider_candidates.remove(\"foo\")",
   "query": {
     "nested": {
       "path": "provider_candidates",
       "query": {
         "bool": {
           "must": [
             {
               "exists": {
                 "field": "provider_candidates.foo"
               }
             }
           ]


         }
       }
     }
   }
 }

сказано

{
  "error" : {
    "root_cause" : [
      {
        "type" : "script_exception",
        "reason" : "runtime error",
        "script_stack" : [
          "ctx._source.provider_candidates.remove(\"foo\")",
          "                               ^---- HERE"
        ],
        "script" : "ctx._source.provider_candidates.remove(\"foo\")",
        "lang" : "painless"
      }
    ],
    "type" : "script_exception",
    "reason" : "runtime error",
    "script_stack" : [
      "ctx._source.provider_candidates.remove(\"foo\")",
      "                               ^---- HERE"
    ],
    "script" : "ctx._source.provider_candidates.remove(\"foo\")",
    "lang" : "painless",
    "caused_by" : {
      "type" : "wrong_method_type_exception",
      "reason" : "cannot convert MethodHandle(List,int)Object to (Object,String)Object"
    }
  },
  "status" : 400
}

1 Ответ

0 голосов
/ 27 февраля 2020

Вам необходимо l oop поле provider_candidates и затем удалить поле внутри него

POST /index51/_update_by_query
 {
  "script" : "for (int i = 0; i < ctx._source.provider_candidates.length; ++i) { ctx._source.provider_candidates[i].remove(\"foo\") }",
   "query": {
     "nested": {
       "path": "provider_candidates",
       "query": {
         "bool": {
           "must": [
             {
               "exists": {
                 "field": "provider_candidates.foo"
               }
             }
           ]
         }
       }
     }
   }
 }

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