ElasticSearch批量请求未导入所有数据,但未显示错误

2eafrhcq  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(2)|浏览(231)

我使用GuzzleHttp通过“_bulk”将数据发送到ElasticSearch索引。这只是一个包含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();
}
xxb16uws

xxb16uws1#

使用HTTP 200时,批量请求始终会成功。
但是,在批量响应中,您应该会看到每个项是否成功的指示。如果您在响应中看到errors: true,那么您就知道某些项无法被索引,并查看items数组,您将发现相应项的错误。

aoyhnmkz

aoyhnmkz2#

正如@瓦尔所指出的,使用$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中,我在将数据发送到ElasticSearch之前将其保存为php数组。

相关问题