0

在尝试使用纯 elasticsearch-painless 切换 PHP 代码时,我注意到即使文档在更新前后相同,文档也不会返回“noop”。

我不确定每次执行代码时更新版本是否有任何后果?它是如何扩展的?

views如果在 中找不到身份,我只是想在访问期间更新帖子views_log,并且想知道是否有办法修复“noop”返回,或者以某种方式取消更新?

我现在的代码如下所示:

$script = 'if (!ctx._source.views_log.contains(params.identity)) {
             ctx._source.views_log.add(params.identity);
             ctx._source.views += 1;
           }';

$params = [
    'index' => 'post',
    'id'    => 4861,
    'body'  => [
        'script' => [
            'source' => $script,
            'lang' => "painless",
            'params' => [
                'identity' => $identifier
            ]
        ]
    ]
];

$response = $client->update($params);

遵循弹性搜索的文档

ctx['op']:使用默认索引来更新文档。设置为 none 以指定无操作或 delete 以从索引中删除当前文档。

如果条件不满足,我尝试设置ctx.opnone,但这似乎不起作用。

4

1 回答 1

0

在写这个问题的过程中,我想通了,不妨与其他人分享。


none是 ctx.op 的可接受关键字,它接受一个字符串。更改none"none"

所以完整的脚本应该是这样的:

$script = 'if (!ctx._source.views_log.contains(params.identity)) {
             ctx._source.views_log.add(params.identity);
             ctx._source.views += 1;
           } else {
             ctx.op = "none";
           }';

$params = [
    'index' => 'post',
    'id'    => 4861,
    'body'  => [
        'script' => [
            'source' => $script,
            'lang' => "painless",
            'params' => [
                'identity' => $identifier
            ]
        ]
    ]
];

$response = $client->update($params);

这将给出所需的"result": "noop"

于 2022-02-23T20:01:21.833 回答