我使用GuzzleHttp通过"_散装;到弹性搜索索引。它只是一个850条记录的小数据集。当我逐条记录传输数据时,我会收到17条记录的错误消息。这对我来说很好,所以我可以纠正错误。
但是当我使用_bulk时,我根本不会收到任何错误消息。17条不正确的记录被忽略,并且在索引中丢失。如何在此处获取错误消息?有什么我可以使用的选项吗?有什么想法吗?
终点是:
以下是我的主要代码部分:
$jsonData = "xxxxx"; // the payload for the request
$elasticUrl = "https://xxxx.xx/xxxxx/_doc/_bulk";
$client = new Client([
"verify" => false, // disable ssl certificate verification
"timeout" => 600, // maximum timeout for requests
"http_errors" => false // disable exceptions
]);
$header = ["Content-Type" => "application/json"];
$result = $client->post($elasticUrl,
[
"headers" => $header,
"body" => $jsonData
]
);
if ($result->getStatusCode() != 200) {
$ret = "Error ".$result->getStatusCode()." with message: ".$result->getReasonPhrase();
}
使用HTTP 200,批量请求总是会成功的。
但是,在批量响应中,您应该看到每个项目是否成功的指示。如果您在响应中看到errors: true
,那么您知道某些项无法被索引,并且查看items
数组,您会发现相应项的错误。
正如@Val所指出的,$response->getBody()
的使用提供了所需的信息:
$body = (string) $result->getBody();
$bodyArray = json_decode($body, true);
if ($bodyArray["errors"]) {
$retArray = [];
foreach ($bodyArray["items"] as $key => $item) {
if (isset($item["create"]["error"])) {
$retArray[] = $item["create"]["error"]["reason"].": ".json_encode($data[$key]);
}
}
$ret = implode(", ", $retArray);
}
附带说明:在$data
中,在将数据发送到Elastic Search之前,我将数据保留为php数组。