Эластичный поисковый скрипт для возврата значения - PullRequest
0 голосов
/ 14 октября 2019

Я работаю над сценарием, который обновляет вложенное поле индекса. В основном это добавляет новый вложенный документ. Я хочу обновить скрипт, чтобы он возвращал общее количество вложенных документов для этого поля.

Вот структура

Индекс: вложенное поле темы: users_read

Всякий раз, когдановый пользователь читает, его имя добавляется в "users_read". Это происходит через скрипт.

Я хочу изменить скрипт, чтобы он возвращал значение числа 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"
                        }
                    ]
        }
}

Вот скрипт, который я использую

POST -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 Ответ

0 голосов
/ 04 ноября 2019

Мне пришлось удалить «источник» из скрипта. Наличие как исходного, так и встроенного в одном скрипте не будет работать.

...