Обновление вложенного объекта вasticsearch - PullRequest
0 голосов
/ 29 октября 2018

У меня есть приведенное ниже отображение для индекса

{
  "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 (хотя я обновляю только один объект в массиве) - мне это не кажется идеальным или все нормально?

1 Ответ

0 голосов
/ 29 октября 2018

Нет синтаксиса для обновления конкретного вложенного документа. Вы можете указать только значение вложенного поля, и оно обновит все вложенные документы. В любом случае ES переиндексирует документы с частичным обновлением.

Вы можете использовать документы «родитель-ребенок», чтобы добиться этого любой ценой. Если у вас так много вложенных записей, это может лучше подойти к вашему делу.

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