У меня есть приведенное ниже отображение для индекса
{
"mappings": {
"xxxxx": {
"properties": {
"ID": {
"type": "text"
},
"pairs": {
"type": "nested"
},
"xxxxx": {
"type": "text"
}
}
}
}
}
поле pairs
представляет собой массив объектов со следующей структурой
{
"id": "",
"Answer": "",
"Question": []
}
То, что я пытаюсь сделать, это получить определенный вложенный объект и обновить его. Я пробовал updateByQuery
метод с частичным doc / script, но я не могу обновить
1012 * сценарий *
var theScript = {
"inline": "ctx._source.Answer = 'Elastic search update Test'"
}
client.updateByQuery({
index: 'sample',
_source: false,
body: {
query: {
bool: {
must: [
{
"match": {
"ID": '2rXdCf5OM9g1ebPNFdZNqW'
}
},
{
"nested": {
"path": "pairs",
"query": {
"match": {
"pairs.id": "c1vNGnnQLuk"
}
},
"inner_hits": {}
}
}
]
}
},
"script": theScript
}
},function(err, body){
if(err){
throw err;
}
console.log('body: ', body)
console.log('data: ', body.hits.hits)
})
частичный документ
client.updateByQuery({
index: 'sample',
_source: false,
body: {
query: {
bool: {
must: [
{
"match": {
"ID": '2rXdCf5OM9g1ebPNFdZNqW'
}
},
{
"nested": {
"path": "pairs",
"query": {
"match": {
"pairs.id": "c1vNGnnQLuk"
}
},
"inner_hits": {}
}
}
]
}
},
"doc": {
"Answer": 'Elastic search update Test'
}
}
},function(err, body){
if(err){
throw err;
}
console.log('body: ', body)
console.log('data: ', body.hits.hits)
})
Я получаю следующую ошибку:
частичное обновление
Error: [parsing_exception] Unknown key for a START_OBJECT in [doc]., with { line=1 & col=191 }
сценарий
Error: [illegal_argument_exception] [sample][conversation][AWa-p9zBTJHq-_gvo-Af] didn't store _source
ПРИМЕЧАНИЕ В идеале я хотел бы использовать для этого частичное обновление документа, поскольку вложенный объект немного сложен, и было бы невозможно написать встроенный скрипт
Версия Elasticsearch - 5,6
UPDATE
делает что-то вроде этого работает
{
"script" : {
"inline": "ctx._source.pairs= params.pairs",
"lang": "painless",
"params" : {
"pairs" : [{...}, {...}, ...]
}
}
}
но это, по сути, означает, что каждый раз, когда я обновляюсь, я перезаписываю все поле pairs
(хотя я обновляю только один объект в массиве) - мне это не кажется идеальным или все нормально?