0

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

ElasticSearch 中的映射是自动创建的,这部分工作没有问题。我所有的数据都是同步的。

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


我的索引叫做products,类型也是products。我添加了这样的新映射:

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"
}

但是,当我尝试更新产品以向新字段添加值时,我得到了一个非法参数异常,如下所示:

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
    }
}) ;

抛出非法参数异常:

ctx._source.ProductCityViews

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

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

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

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

4

0 回答 0