[Elasticsearch]Elasticsearch中如何批量更新索引中已有文档的object字段的值呢?
2.22K 次浏览
对关系型数据库(如:SQL Server,MySQL,Oracle,PostgreSQL等)熟悉的知道,要批量更新某个数据表的某个字段值,语法大致如下:
UPDATE TABLE_NAME SET ColumnName1='Value1' WHERE ...
但在Elasticsearch这种非关系型数据库中,需要更新某个字段的值则要使用Elasticsearch的_update_by_query
API和DSL脚本,如下:
POST my-test-001/_update_by_query
{
"script": {
"source": "ctx._source.name='Rector'",
"lang": "painless"
},
"query": {
"match_all": {}
}
}
以上是批量更新Elasticsearch索引中指定文档的某个字段的值,这个字段是具体的数据类型,而非object。
但如果要更新的字段类型为object呢?
比如在Elasticsearch中,假如有一个索引(测试用例)的映射关系为:
PUT my-test-001/
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
}
}
}
}
测试数据如下:
POST my-test-001/_doc
{
"name":"rector"
}
POST my-test-001/_doc
{
"name":"jack"
}
根据需求,向my-test-001
索引中新增了一个object类型的字段,映射关系如下:
PUT my-test-001/_mapping
{
"properties": {
"company": {
"properties": {
"company_id": {
"type": "keyword"
},
"company_name": {
"type": "text"
}
}
}
}
}
在索引my-test-001
中,对于已有文档来说,新增的字段company
是没有值的,现需要使用Elasticsearch的DSL语句批量更新(设置)company
字段中company_id
和company_name
的值,应该如何操作呢?
期望的更新后的结果为:
{
{
"name" : "rector",
"company" : {
"company_id" : "83194bff-a8bd-4a0e-a177-975c2def8222",
"company_name" : "BTA"
}
},
{
"name" : "jack",
"company" : {
"company_id" : "83194bff-a8bd-4a0e-a177-975c2def8222",
"company_name" : "BTA"
}
}
}