添加项目以清空对象

时间:2018-04-06 10:50:27

标签: node.js elasticsearch elasticsearch-painless

我使用 go-mysql-elasticsearch 来同步MySQL和ElasticSearch之间的数据。这样,一旦在MySQL中创建了一个项目,它就会在ElasticSearch中自动创建。

ElasticSearch中的映射是自动创建的,该部分可以正常运行。我的所有数据都是同步的。

当我尝试向ElasticSearch索引添加新映射并修改它们时,会出现问题。

我的索引称为产品,类型也是产品。我添加了这样的新映射:

PUT 127.0.0.1:9200/products/_mapping/products
{
  "properties": {
    "ProductCityViews" : {
      "properties": {

      }
    }
  }
}

这可以按预期工作,当我访问时:

GET http://127.0.0.1:9200/products?pretty=true

我可以看到新的映射已添加到产品索引中:

"ProductCityViews" : {
  "type" : "object"
}

但是,当我尝试更新产品以向新字段添加值时,我会收到 illegal_argument_exception ,如下所示:

client.update( {
    index: 'products',
    type: 'products',
    id: id,
    body: {
        script: `
        if ( ctx._source.ProductCityViews["Washington"] == null ) { // If ProductCityViews.Washington doesn't exist
            ctx._source.ProductCityViews["Washington"] = 1; // Create it
        }
        `,
        lang: "painless"
    }
}, ( error, response, status ) => {
    if ( error ) {
        console.log( error, response, status ); // Log the error to the console
        return; // Return to prevent further actions
    }
}) ;

illegal_argument_exception 抛出:

ctx._source.ProductCityViews

这是有道理的,因为产品没有为此设置任何值,这意味着它为空。
这里的问题是,如何更新该空字段?
谷歌没有给我任何可靠的答案,因此这篇文章。

为了澄清,我最终试图实现这一目标:

ProductCityViews: {
  Washington: 1,
  Tokyo: 23
}
  • 如何更新ElasticSearch中的空对象?

甚至可能吗?
我错过了什么吗?

0 个答案:

没有答案