Удалить вложенный массив вasticsearch - PullRequest
0 голосов
/ 11 января 2019

У меня есть документы, содержащие вложенные таблицы в следующем формате:

{
"dataId": "dataIdentifier",
"versionId": "versionIdentifier",
"items": [
{
"obj1": "value1",
"obj2": "value2",
"obj3": "value3",
 },
 {
"obj1": "value4",
"obj2": "value5",
"obj3": "value6"
}, 
{
"obj1": "value7",
"obj2": "value8",
"obj3": "value9" 
}        
]
}

С вложенными типами "items". Я хочу удалить один из элементов внутри заданных «элементов», чем один из элементов внутри имеет определенное значение. Например, это будет:

if (obj1 == "value4" & dataId == "dataIdentifier" & versionId == versionIdentifier) :
    DELETE TABLE ENTRY 

В этом случае я хочу удалить вторую запись "items". Я попытался сделать это с update_by_query , и моя попытка была:

q = {
   "query": {
    "match_all": {}
    }
},
"script": {
    "lang" : "painless",
    "inline" : {if (ctx._source.dataId == item.dataId && ctx._source.versionId == item.versionId && ctx._source.items.obj1 == item.obj1) {ctx._source.items.remove()}}",
    "params" : {
        'dataFrame': [{
            "dataId" : 'myDataIdList',
            "versionId" : 'myVersionId',
            "obj1" : 'myValue'
            } ]
    }
 }    
}

es.update_by_query(index=myindex, body=q)

Но я не знаю, как обозначить соответствующую запись в аргументе "ctx._source.items.remove ()". Я взглянул на документацию Elasticsearch, но не смог найти то, что искал. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 января 2019

При обновлении по запросу вы не можете удалить «поле», вы можете заменить его, для этого вы можете обновить его двумя другими значениями, которые вы хотите сохранить или удалить документ, и индексировать новое с этими двумя значения

...