当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch:如何删除嵌套对象元素?

司马彬
2023-03-14

我正在使用ElasticSearch5.4,试图从嵌套数据类型中删除一个元素。

我有以下映射:

"links_to_asset": {
    "type": "nested",
    "properties": {
        "note_link_id": {
            "type": "long"
        },
        "user_id": {
            "type": "long"
        },
        "creation": {
            "type": "date",
            "format": "date_hour_minute_second"
        },
        "modification": {
            "type": "date",
            "format": "date_hour_minute_second"
        },
        "to_asset": {
            "type": "integer"
        },
        "from_asset": {
            "type": "integer"
        },
        "comment": {
            "type": "text",
            "fields": {
                "std": {
                    "type": "text",
                    "analyzer": "asset_en_analyzer",
                    "fields": {
                        "std": {
                            "type": "text",
                            "analyzer": "standard"
                        }
                    }
                }
            }
        }
    }
}

我在《邮递员》中尝试过以下内容:

localhost:9200/asset/bookmark/20976/_update?pretty

{
    "script": "ctx._source.links_to_asset.removeAll{it['note_link_id'] == id}",
    "params": {
        "id": 7343
    }
}

但我得到以下错误:

{
    "error": {
        "root_cause": [
            {
                "type": "remote_transport_exception",
                "reason": "[NvXYDwh][127.0.0.1:9300][indices:data/write/update[s]]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "failed to execute script",
        "caused_by": {
            "type": "script_exception",
            "reason": "compile error",
            "script_stack": [
                "... .links_to_asset.removeAll{it['links_to_asset.note_ ...",
                "                             ^---- HERE"
            ],
            "script": "ctx._source.links_to_asset.removeAll{it['links_to_asset.note_link_id'] == id}",
            "lang": "painless",
            "caused_by": {
                "type": "illegal_argument_exception",
                "reason": "unexpected token ['{'] was expecting one of [{<EOF>, ';'}]."
            }
        }
    },
    "status": 400
}

我在StackOverflow[1][2]的几个不同问题中遵循了这些建议,但没有成功。

嵌套对象是有效的,因为我已经用数据填充了它。此外,id值也是有效的。

共有1个答案

颛孙天宇
2023-03-14

您试图编写Groovy脚本,但您使用的脚本语言是ElasticSearch5.x中的Painless

试试像这样的事

ctx._source.foo = ctx._source.foo.stream().filter(x -> x =='a').collect(Collectors.toList())
 类似资料:
  • 我有一个模型,在几个模型中设置为外键。现在从模型中删除任何对象时,如果该对象在这些模型中被引用,则会抛出ProtectedError。我想让用户在一次操作中删除包含所有受保护对象的对象。 我只需调用 但是当有自己的受保护对象时,操作失败并抛出另一层。我想要实现的是,删除所有受保护的对象,而不区分它存在于哪一层。我知道这可能是一个危险的操作。但我能在没有复杂解决方案的情况下实现这一点吗。提前谢谢。

  • 问题内容: 我有一个Elasticsearch文档,其中包含嵌套对象,我希望能够通过java update api删除它们。这是包含脚本的代码: 这是我的文档的映射: 我没有收到任何错误消息,但是当我在索引上运行查询以查找该嵌套文档时,它并没有被删除。有人可以让我知道我在做什么错吗? 问题答案: 因为是您的脚本,所以需要对其进行说明并按如下方式进行修改(请参见该字段周围的转义双引号)。还有第二种错

  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助

  • 我有一个映射: 我使用三个条件进行筛选: “日志类型”是“爬虫” “2020-05-23”上的“创建数据” “resp”的大小=0 我试图过滤与查询: {"查询":{"bool":{"必须":[{"术语":{"_logType":{"value":"爬虫"}}},{"范围":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zon

  • 问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个: