如何在Elasticsearch中删除用户1粉丝列表中的用户2
解决Elasticsearch移除粉丝列表元素的问题
我来帮你搞定这个需求!要从用户1(id为1)的followers列表里移除用户2(id为2),你可以用Elasticsearch的**更新API(Update API)**结合Painless脚本来实现,具体分两种情况来看:
情况1:你的文档_source是用户对象数组(如你提供的搜索结果所示)
根据你给出的搜索结果,单个文档的_source是包含多个用户对象的数组,那对应的更新语句如下:
POST /users/user/742/_update { "script": { "source": """ for (def user : ctx._source) { if (user.id == '1') { user.followers.remove('2'); break; // 找到目标用户后停止循环,提升效率 } } """, "lang": "painless" } }
语句说明:
POST /users/user/742/_update:指定要更新的索引名、类型名和文档ID(就是你搜索结果里那个hit的_id值742)。- Painless脚本遍历
ctx._source数组,找到id为1的用户对象,然后调用remove('2')从他的followers列表里移除用户2的ID。
情况2:你的文档_source是单个用户对象(更常见的结构)
如果是每个文档对应一个用户(_source是单个用户对象,而非数组),那脚本会更简洁,甚至可以通过查询条件定位目标用户,不用依赖文档ID:
POST /users/user/_update_by_query { "script": { "source": "ctx._source.followers.remove('2')", "lang": "painless" }, "query": { "term": { "id": "1" } } }
语句说明:
_update_by_queryAPI会先执行query找到所有id为1的用户文档,然后对这些文档执行脚本操作,移除followers里的2。- 如果确定只有一个目标用户,也可以用单个更新API,只要替换掉文档ID即可。
注意事项:
- 确保你的Elasticsearch版本支持Painless脚本(5.0及以上版本默认启用)。
- 如果
followers数组里本来就没有2这个值,脚本不会报错,也不会产生任何修改。 - 执行更新后,可以重新搜索该文档,验证
followers列表是否已经移除了用户2的ID。
内容的提问来源于stack exchange,提问作者Rizwan Saleem
相关产品推荐
相关产品推荐

