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

用于返回值的弹性搜索更新脚本

任昊阳
2023-03-14

我正在编写一个脚本,用于更新索引的嵌套字段。基本上,它添加了新的嵌套文档。我想更新脚本以返回该字段的嵌套文档的总数。

这里是结构

索引:主题嵌套字段:users_read

每当一个新用户阅读时,他的名字就会被添加到“users_read”中。这通过脚本发生。

我想修改脚本以返回number of users_read的值。

{
                "_index": "topic",
                "_type": "_doc",
                "_id": "11111",
                "_score": 1.0,
                "_source": {
                    "id": "11111",
                    "users": [
                        {
                            "users_read": "div.sar@abc.com"
                        },
                        {
                            "users_read": "admin2@xyz.com"
                        },
                        {
                            "users_read": "admin"
                        },
                        {
                            "users_read": "admin2@def.com"
                        }
                    ]
        }
}

这是我正在使用的脚本

邮政 - http://elasticserver:9200/topic/_update/11111

{
    "script": {
        "inline": "ctx._source.users.add(params.user)",
        "lang": "painless",
        "params": {
            "user": {
                "users_read":"admin2@dfg.com"
            }
        },
        "source": "ctx._source.users.size()"
    }
}

但是我看到了一个例外

{
    "error": {
        "root_cause": [
            {
                "type": "x_content_parse_exception",
                "reason": "[10:19] [script] failed to parse field [source]"
            }
        ],
        "type": "x_content_parse_exception",
        "reason": "[10:19] [UpdateRequest] failed to parse field [script]",
        "caused_by": {
            "type": "x_content_parse_exception",
            "reason": "[10:19] [script] failed to parse field [source]",
            "caused_by": {
                "type": "illegal_argument_exception",
                "reason": "must only use one of [source, id] when specifying a script"
            }
        }
    },
    "status": 400
}

删除“源”部分时,脚本将更新字段。

POST - http://elasticserver:9200/topic/_update/11111

{
    "script": {
        "inline": "ctx._source.users.add(params.user)",
        "lang": "painless",
        "params": {
            "user": {
                "users_read":"admin2@dfg.com"
            }
        }
    }
}

{
    "_index": "topic",
    "_type": "_doc",
    "_id": "11111",
    "_version": 4,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

非常感谢任何帮助。

共有1个答案

易书
2023-03-14

我不得不从脚本中删除“源”。在单个脚本中同时拥有source和inline将不起作用。

 类似资料:
  • 我试图从弹性搜索集群中获取数据。索引名称:testIndex类型:testType主机:localhost端口:8080 我想使用弹性搜索5.4版本,使用RestClient,我想使用多重匹配查询获取数据。 示例查询如下所示。 最好的方法是什么?我是否可以使用QueryBuilder构建查询并将其用于rest客户端。

  • 这是我的结果源看起来的样子。 {“script”:{“inline”:“ctx._source.name='Where's My Crown”“,”lang“:”painless“},”query“:{”match“:{”movie_id“:69}}} 但我有一个错误: {“type”:“illegal_argument_exception”,“reason”:“意外标记['s']应为[{,‘;’

  • 我正在使用spring数据elasticsearch来执行CRUD操作。 我有一个扩展Elasticsearch chRepository的自定义存储库。 最终,ElasticsearchRepository扩展了CrudRepository,这意味着可以更新现有记录。 问题是,你是如何做到这一点的?我还没有找到一个名为“update()”的方法 我认为做以下事情会有用(代码从https://gi

  • 我有一个问题,我想把弹性搜索的结果减少到1000个,不管有多少匹配的结果匹配,但这不应该影响排名和得分。 我在尝试,但这似乎只是告诉弹性搜索只获得前N个结果,而不考虑分数。如果我说错了,请纠正我。 有什么帮助吗? 编辑: 我已经在使用分页。因此,在From/Size中使用Size只会影响当前页面的大小。但我想将总结果的大小限制为1000,然后对其进行分页。

  • 我正在尝试使用无痛脚本更新文档。我的文档包含等字段(字段名称包含字符 )。 文档示例: 执行以下脚本时,我得到了< code >“a4ayc/8”字段的异常: [type=illegal_argument_exception,原因=无效赋值:无法为除法操作赋值 [/]] 脚本: 有没有解决方法?

  • 我是ES的新手,我正在尝试使用聚合编写搜索查询。 在写同样的东西时,我面临着无痛脚本的问题。 哪里可以得到完整的无痛脚本文档,用于弹性搜索?