我使用 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
}
甚至可能吗?
我错过了什么吗?