我使用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 中的空对象?
甚至可能吗?
我错过了什么吗?