我在尝试从elasticsearch中的数组中删除元素/对象时遇到了问题。
这是索引的Map:
{
"example1": {
"mappings": {
"doc": {
"properties": {
"locations": {
"type": "geo_point"
},
"postDate": {
"type": "date"
},
"status": {
"type": "long"
},
"user": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
字符串
这是一个示例文档。
{
"_index": "example1",
"_type": "doc",
"_id": "8036",
"_score": 1,
"_source": {
"user": "kimchy8036",
"postDate": "2009-11-15T13:12:00",
"locations": [
[
72.79887719999999,
21.193036000000003
],
[
-1.8262150000000001,
51.178881999999994
]
]
}
}
型
使用下面的查询,我可以添加多个位置。
POST /example1/_update_by_query
{
"query": {
"match": {
"_id": "3"
}
},
"script": {
"lang": "painless",
"inline": "ctx._source.locations.add(params.newsupp)",
"params": {
"newsupp": [
-74.00,
41.12121
]
}
}
}
型
但是我不能从位置中删除数组对象。我已经尝试了下面的查询,但它不起作用。
POST example1/doc/3/_update
{
"script": {
"lang": "painless",
"inline": "ctx._source.locations.remove(params.tag)",
"params": {
"tag": [
-74.00,
41.12121
]
}
}
}
型
请让我知道我在这里做错了什么。我使用的是弹性版本5.5.2
4条答案
按热度按时间jyztefdp1#
在轻松的脚本中,
Array.remove()
方法通过索引而不是值来删除。下面是一个在Elasticsearch脚本中通过值删除数组元素的工作示例:
字符串
如果你的脚本只需要从一个特定的数组属性中删除值,你可能需要简化脚本。例如,从文档的
.color_list
数组中删除"green"
:型
删除
"green"
的脚本:型
bqjvbblv2#
与
add()
不同,remove()
获取元素的索引并将其删除。painless中的
ctx._source.locations
是一个ArrayList
,它有List
的remove()
方法:E remove(int index)
在列表中指定的位置添加元素(可选操作).
其他方法见无痛API -列表。
参见this answer示例代码。
wb1gzix03#
字符串
如果使用
ctx._source.locations.add(elt)
添加元素,则使用ctx._source.locations.remove(indexToRemove)
删除数组中元素的索引。kd3sttzy4#
字符串