我有一个特定的要求,我必须为弹性搜索索引添加一个附加属性,该索引有n个文档。仅当文档不包含属性时才必须执行此操作。这项任务基本上涉及两个步骤
1)搜索 2)更新
我知道如何使用多个查询执行此操作。但如果我设法在一个查询中执行此操作,那将会很棒。可能吗?如果是,有人可以告诉我如何做到这一点。
答案 0 :(得分:1)
您可以使用update by query结合exists查询来更新新字段并将其添加到仅包含该属性的文档中。
例如,您只有一个文档包含字段attrib2
,其他文档没有该字段。
curl -XPUT "http://localhost:9200/my_test_index/doc/1" -H 'Content-Type: application/json' -d'
{
"attrib1": "value1"
}'
curl -XPUT "http://localhost:9200/my_test_index/doc/2" -H 'Content-Type: application/json' -d'
{
"attrib1": "value21"
}'
curl -XPUT "http://localhost:9200/my_test_index/doc/3" -H 'Content-Type: application/json' -d'
{
"attrib1": "value31",
"attrib2": "value32"
}'
以下update by query将完成这项工作。
curl -XPOST "http://localhost:9200/my_test_index/_update_by_query" -H 'Content-Type: application/json' -d'
{
"script": {
"lang": "painless",
"source": "ctx._source.attrib2 = params.attrib2",
"params": {
"attrib2": "new_value_for_attrib2"
}
},
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "attrib2"
}
}
]
}
}
}'
只会在那些尚未包含该字段的文档中将新值new_value_for_attrib2
设置为字段attrib2
。