仅当更新前不存在用户时如何将用户添加到索引 Elasticsearch

Posted

技术标签:

【中文标题】仅当更新前不存在用户时如何将用户添加到索引 Elasticsearch【英文标题】:How to add user to Index Elasticsearch only if one dosen't exist before updating 【发布时间】:2017-06-03 22:09:44 【问题描述】:

我正在使用 elasticsearch ,我遇到的问题是有时用户没有被添加到索引中,不知道为什么,只是有时会发生。

1.我的设置是当您注册到我的网站时,用户会被添加到索引中 2.当用户更新他们的个人资料时,索引会更新他们的新信息

3.当用户去更新或编辑他们的个人资料时,如果他们没有被添加到索引中,则会引发错误。

如果它们在更新时尚未添加,我希望能够将它们添加到索引中,换句话说,如果尚未添加到索引中,则在更新之前添加它们

这就是我的更新方式

$client = Clientbuilder::create()->build();
    $response = $client->update([
        'index' => 'users',
        'type' => 'user',
        'id' => Auth::user()->id,
        'body' => [
            'doc' => [
                $field => $data,
            ],
        ],

    ]);

然后

if ($request->has('name')) 
        $user->name = strip_tags($request->input('name'));
        $user->save();

        //update elasticsearch users index
        $user->elasticupdate('name',$user->name);

    

我像这样将它们添加到索引中

$client = Clientbuilder::create()->build();
        $response = $client->index([
            'index' => 'users',
            'type' => 'user',
            'id' => $user->id,
            'body' => [
                'username' => $user->username,
                'name' => $user->name,
                'profession' =>$user->getProfession(),
                'secondary_profession' =>$user->getSecondaryProfession(),
                'genre' => $user->getUserGenre(),
                'subgenre' => $user->getUserSubGenre(),
                'city' => $user->getCity(),
                'profilepic' => 'n026qso2xxztaphbwwey.png', //Default pics
                'backgroundpic' => 'backgrounddefaultpms_oa9mee.png', //Default pics
                // 'profilepic' => $user->getProfilePic(),
                // 'backbroundpic' => $user->getBackroundPic(),
                'country' => $user->country,
                'country_fips_code' => $user->country_fips_code,
                'state' => $user->getState(),
                //'affiliations' => $user->getAffiliations(),
                'affiliation_one' => ' ',
                'affiliation_two' => ' ',
                'affiliation_three' => ' ',
                'affiliation_four' => ' ',
                'affiliation_five' => ' ',
                'credential_one' => ' ',
                'credential_two' => ' ',
                'credential_three' => ' ',
                'credential_four' => ' ',
                'credential_five' => ' ',
                // 'countryAbr' => $countryAbr,
                // 'stateAbr' => $stateAbr,
                'cityGeonameId' => $user->geoname_id,
                'latlong' => [$origin],
            ],

        ]);

我想过只运行这个他们更新个人资料的所有内容,但是如果我设置为默认值的某些字段填充了实际数据,例如,如果用户实际上已经添加到索引中并且一切正常,那么这将覆盖它,任何想法

【问题讨论】:

【参考方案1】:

您应该将op_type 字段设置为create 值,如下所示:

$client = Clientbuilder::create()->build();
$response = $client->index([
    'index' => 'users',
    'type' => 'user',
    'id' => $user->id,
    'op_type' => 'create',
    'body' => [
        'username' => $user->username,
        'name' => $user->name,
        'profession' =>$user->getProfession(),
        'secondary_profession' =>$user->getSecondaryProfession(),
        'genre' => $user->getUserGenre(),
        'subgenre' => $user->getUserSubGenre(),
        'city' => $user->getCity(),
        'profilepic' => 'n026qso2xxztaphbwwey.png', //Default pics
        'backgroundpic' => 'backgrounddefaultpms_oa9mee.png', //Default pics
        // 'profilepic' => $user->getProfilePic(),
        // 'backbroundpic' => $user->getBackroundPic(),
        'country' => $user->country,
        'country_fips_code' => $user->country_fips_code,
        'state' => $user->getState(),
        //'affiliations' => $user->getAffiliations(),
        'affiliation_one' => ' ',
        'affiliation_two' => ' ',
        'affiliation_three' => ' ',
        'affiliation_four' => ' ',
        'affiliation_five' => ' ',
        'credential_one' => ' ',
        'credential_two' => ' ',
        'credential_three' => ' ',
        'credential_four' => ' ',
        'credential_five' => ' ',
        // 'countryAbr' => $countryAbr,
        // 'stateAbr' => $stateAbr,
        'cityGeonameId' => $user->geoname_id,
        'latlong' => [$origin],
    ],

]);

在这种情况下,如果具有相同 id 的用户已经存在,请求将返回错误,并且您不会覆盖现有的。看看这里的“版本控制”部分https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html

【讨论】:

这几乎完成了工作,但是它引发的错误是什么搞砸了,我怎样才能做到这一点,如果 id 已经存在,它只是继续下一行代码而不是抛出一个错误 您应该只处理错误或跳过它。应该不是问题

以上是关于仅当更新前不存在用户时如何将用户添加到索引 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章

仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?

仅当 cookie 存在时,如何在剃须刀页面中添加 HTML?

如何在使用Devise注册时创建新用户时添加或更新关联的属性?

仅当文件尚不存在时才将行附加到文件中

SaltStack:仅当目录存在时才使用目录作为源

更新:我不知道为什么时间差小于180秒仍然在用户评级栏中增加10