在Elasticsearch中向现有索引添加新字段

时间:2016-09-03 16:07:14

标签: php elasticsearch laravel-5

好的,我已经创建了一个名为users的弹性搜索索引,如下所示:

$response = $client->index([
        'index' => 'users',
        'type' => 'user',
        'id' => Auth::user()->id,
        'body' => [
            'username' => Auth::user()->username,
            'name' => Auth::user()->name,
            'city' => Auth::user()->getCity(),
        ],

    ]);

我已将某些数据编入索引。我想在此索引中添加一个名为“location”的新字段,以便它现在为:

$response = $client->index([
        'index' => 'users',
        'type' => 'user',
        'id' => Auth::user()->id,
        'body' => [
            'username' => Auth::user()->username,
            'name' => Auth::user()->name,
            'city' => Auth::user()->getCity(),
            'location' => [$origin],
        ],

    ]);

我的问题是如何将该字段添加到现有数据中。我已有用户,但没有位置字段。我需要将该字段添加到旧用户数据中,以便当用户更新其信息时,他们不会丢失任何分片错误

{"error":{"root_cause":[{"type":"document_missing_exception","reason":"[user][130]: document missing","shard":"0","index":"users"}],"type":"document_missing_exception","reason":"[user][130]: document missing","shard":"0","index":"users"},"status":404}

2 个答案:

答案 0 :(得分:1)

您可以使用Update API

来实现这一目标

如果这是一个新索引 - 更新将失败。

为了避免这种情况 - 请使用upsert。

答案 1 :(得分:1)

我不确定为什么你会看到碎片错过了这样的事情。使用Elasticsearch,默认情况下映射是动态的(请参阅Dynamic Mapping)。这意味着您应该能够像现在一样点击索引API,以便向现有用户文档和新用户文档添加新位置信息,并能够搜索此信息。

这样做的缺点是,您可能已将索引位置信息的文档编入索引,并且后续文档中的位置信息与此类型不匹配(请参阅Field datatypes)。也许,您可能希望对Elasticsearch映射进行很好的控制,以避免遇到类似的问题,或者问题可能完全不同。

编辑:根据最近有关document_missing_exception的问题中提供的详细信息,这并不相关。