我正在尝试批量处理 - 通过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库。
我做错了什么?
答案 0 :(得分:0)
您是否考虑过在ES文档中编写的内容,当向_bulk端点发送请求时,Content-Type标头应设置为application / x-ndjson
其他可能是您正在使用L <- list(mtcars, mtcars, mtcars)
,但对ES的真实请求是POST。
根据DOCS,它可能导致libcurl发送无效请求,并且可能会严重混淆远程服务器
如果其中一种方法有效,请告诉我,我会将答案编辑为正确的
答案 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);