批量索引与elasticsearch和PHP curl


bulk index with elasticsearch and php curl

我试图执行一个php CURL请求ElasticSearch索引几个条目在同一时间(与_bulk),但我总是得到基于请求体不同的错误

>         $posted = '';
>         for ($i = 0; $i < 10; $i++) {
>             $posted .= json_encode(array(
>                 'index' => new stdClass(),
>             )) .''n';
> 
>             $posted .= json_encode(array(
>                 'id' => $i,
>                 'name' => 'XX' . $i,
>             ));
>             
>             if($i < 9){
>                 $posted .''n';
>             }
>         }
> 
>         $fullURL = 'http://127.0.0.1:9200/myindex/mytype/_bulk';
>         $conn = curl_init($fullURL);
> 
>         curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
>         curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, false);
>         curl_setopt($conn, CURLOPT_SSL_VERIFYHOST, false);
>         curl_setopt($conn, CURLOPT_FAILONERROR, false);
>         curl_setopt($conn, CURLOPT_CUSTOMREQUEST, 'POST');
>         curl_setopt($conn, CURLOPT_POSTFIELDS, $posted);
>         $res = curl_exec($conn);
>         echo $res;

使用上面的参数字符串,我得到这个错误:

"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"}],"type":"action_request_validation_exception","reason":"Validation Failed: 1:没有添加请求;"},"状态":400}

我用JSON编码的单个请求测试了它,它工作得很好。
那么,如何使用php curl执行_bulk索引呢?

EDIT:—已编辑以提高可读性,请参阅下面的答案。我试了所有我在网上找到的2天,希望它能帮助别人。

我终于让它工作了!

>         $b = array();
>         $sets = array();
> 
>         $params = array(
>             '_id' => null,
>             '_index' => 'myindex',
>             '_type' => 'mytype'
>         );
> 
>         for ($i = 0; $i < 10; $i++) {
>             $doc = array(
>                 'id' => $i,
>                 'name' => 'name ' . $i,
>             );
>             $set = array(
>                 array('index' => $params),
>                 $doc
>             );
>             $sets[] = $set;
>         }
> 
>         foreach ($sets as $set) {
>             foreach ($set as $s) {
>                 $b[] = json_encode($s);
>             }
>         }
>         $body =  join("'n", $b) . "'n";
>         
>         $conn = curl_init();
>         $requestURL = 'http://127.0.0.1:9200/myindex/mytype/_bulk';
>         curl_setopt($conn, CURLOPT_URL, $requestURL);
>         curl_setopt($conn, CURLOPT_TIMEOUT, 5);
>         curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, FALSE);
>         curl_setopt($conn, CURLOPT_SSL_VERIFYHOST, FALSE);
>         curl_setopt($conn, CURLOPT_RETURNTRANSFER, TRUE);
>         curl_setopt($conn, CURLOPT_FAILONERROR, FALSE);
>         curl_setopt($conn, CURLOPT_CUSTOMREQUEST, strtoupper('POST'));
>         curl_setopt($conn, CURLOPT_FORBID_REUSE, 0);
> 
>         if (is_array($body) && count($body) > 0) {
>             curl_setopt($conn, CURLOPT_POSTFIELDS, json_encode($body));
>         } else {
>             curl_setopt($conn, CURLOPT_POSTFIELDS, $body);
>         }
>         
>         $response = curl_exec($conn);
>         echo $response;