如何在 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 循环中,用于多次更新文档。经过我自己的反复试验,这解决了我的问题。我不知道更新是否是最佳做法。但它的工作方式正是我想要的。
这是可能的,您可以使用 Bulk
和 UpdateDocument
批量操作在每个文档中仅更新一个字段:
$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();
如何在 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 循环中,用于多次更新文档。经过我自己的反复试验,这解决了我的问题。我不知道更新是否是最佳做法。但它的工作方式正是我想要的。
这是可能的,您可以使用 Bulk
和 UpdateDocument
批量操作在每个文档中仅更新一个字段:
$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();