如何在 elastica php 中一次更新多个数据?

how to update multiple data in one go in elastica php?

如何在 elastica 中更新多个数据? 逻辑就像,我有一个数组或一串 id, 然后我需要一次性更新连接到每个或那个 id 的所有数据的状态 属性,那么该怎么做呢?, 此文档没有样本

http://elastica.io/api/classes/Elastica.Bulk.Action.UpdateDocument.html

这可能吗?

这是可能的,但你不能只更新一个字段,因为 ES 不是这样工作的。

您需要先检索完整文档,更改字段值并再次将文档保存到 ES(使用与之前相同的 ID)。

除此之外,多个upsert(添加和更新操作之间没有区别)如下所示:

$client = new Elastica\Client();

// Call method from client
$client->addDocuments([
    new Elastica\Document(/*...*/),
    new Elastica\Document(/*...*/),
    new Elastica\Document(/*...*/),
]);

// Or from index
$client->getIndex('index')->addDocuments([
    new Elastica\Document(/*...*/),
    new Elastica\Document(/*...*/),
    new Elastica\Document(/*...*/),
]);

// Or from type
$client->getIndex('index')->getType('type')->addDocuments([
    new Elastica\Document(/*...*/),
    new Elastica\Document(/*...*/),
    new Elastica\Document(/*...*/),
]);

根据文档,有updateDocument函数 为了解决我的问题,我需要传递一组类似于您在上面的示例中所做的文档

    $index = $this->client->getIndex($this->index);
    $type = $index->getType($this->type);
    $doc = new \Elastica\Document(
            $object->whateverIDisIt, $object, $this->type, $this->index
    );
    $response = $type->updateDocument($doc);

我添加的这个示例仅适用于单个文档,我的意思是单个更新。当然,当我说我需要传递一个数组时,这意味着上面的东西在一个 foreach 循环中,用于多次更新文档。经过我自己的反复试验,这解决了我的问题。我不知道更新是否是最佳做法。但它的工作方式正是我想要的。

这是可能的,您可以使用 BulkUpdateDocument 批量操作在每个文档中仅更新一个字段:

$client = new Elastica\Client();

$bulk = new Elastica\Bulk();
$bulk->setIndex('index');
$bulk->setType('type');

$bulk->addAction(
    new Elastica\Bulk\Action\UpdateDocument(
        new Elastica\Document('id1', array('one_field'=>'value1'))
    )
);
$bulk->addAction(
    new Elastica\Bulk\Action\UpdateDocument(
        new Elastica\Document('id2', array('one_field'=>'value2'))
    )
);

$bulk->send();