Elasticsearch - PHP批量

时间:2017-07-06 08:14:41

标签: php curl elasticsearch

我正在尝试批量处理 - 通过PHP的cURL将数据导入elasticsearch。

首先,我想补充一点,我复制了PHP生成的导入数据格式并将其粘贴到Sense中,批量导入工作正常。但是通过cURL将相同的数据发送到同一个链接,使用我在Sense中使用的相同方法,我收到以下错误消息:

{"_index":"product","_type":"pid","_id":"_bulk","found":false}

或者,如果我没有通过链接指定_index和_type并且我通过我发送的json指定它,我收到以下错误

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"No endpoint or operation is available at [_bulk]"}],"type":"illegal_argument_exception","reason":"No endpoint or operation is available at [_bulk]"},"status":400}

我创建cURL请求的方式如下

protected $curl_opts = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_TIMEOUT => 10
);

......

public function sendcURL() {
    $this->curl->create('http://localhost:9200/_bulk';

    foreach($this->curl_opts as $option => $option_value)
        $this->curl->option($option, $option_value);

    $this->curl->http_header('Content-Type', 'application/json');
    $this->curl->option(CURLOPT_BINARYTRANSFER, true);
    $this->curl->option(CURLOPT_HEADER, true);
    $this->curl->post($json_data);
    $this->execute();
}

考虑到$ json_data正确格式化,并考虑我正在使用正确的链接/方法。

同样,我知道elasticsearch-php github repo(甚至搜索过它们如何在那里进行批量处理,它与我的方法类似),但我会先写自己的方法&目前我需要的库不需要一个完整的弹性php库。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您是否考虑过在ES文档中编写的内容,当向_bulk端点发送请求时,Content-Type标头应设置为application / x-ndjson

ES bulk Docs

其他可能是您正在使用L <- list(mtcars, mtcars, mtcars) ,但对ES的真实请求是POST。

根据DOCS,它可能导致libcurl发送无效请求,并且可能会严重混淆远程服务器

CURL_OPT DOCS

如果其中一种方法有效,请告诉我,我会将答案编辑为正确的

答案 1 :(得分:0)

CURLOPT_CUSTOMREQUEST => 'GET'可以与php curl一起使用:

$requests = '';
foreach ($queries as $query) {
    list ($data, $headers) = $query;
    $requests .= json_encode($headers) . "\n";
    $requests .= json_encode($data) . "\n";
}

$ch = $this->_ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requests);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-ndjson']);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$response = @curl_exec($ch);