在Elasticsearch中更新嵌套对象

时间:2018-10-29 13:49:55

标签: elasticsearch

我具有下面的索引映射

{
  "mappings": {
    "xxxxx": {
      "properties": {
        "ID": {
          "type": "text"
        },
        "pairs": {
          "type": "nested"
        },
        "xxxxx": {
          "type": "text"
        }
      }
    }
  }
}

pairs字段是具有以下结构的对象数组

{
    "id": "",
    "Answer": "",
    "Question": []
}

我想做的是检索特定的嵌套对象并更新它。我已经尝试使用部分文档/脚本的updateByQuery方法,但是无法更新

脚本

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

更新

做类似的事情

{
    "script" : {
        "inline": "ctx._source.pairs= params.pairs",
        "lang": "painless",
        "params" : {
            "pairs" : [{...}, {...}, ...]
        }
    }
}

但这实际上意味着每次我更新时,我都将重写整个pairs字段(即使我只更新数组中的一个对象)-这对我来说并不理想还是很好?

2 个答案:

答案 0 :(得分:1)

其中有一个包含有关嵌套类型管理的快速教程的页面:How to manage nested objects in Elasticsearch documents。它说明了如何添加,删除和编辑嵌套对象。

答案 1 :(得分:0)

没有用于更新特定嵌套文档的语法。您只能指定一个嵌套字段值,它会更新所有嵌套文档。无论如何,ES都会对文档进行重新索引并进行部分更新。

您可以使用父子文档来实现此目的,而需要花费一定的费用。如果您有太多的嵌套记录,那么它可能更适合您的情况。