我正在尝试批量-通过PHP将数据通过cURL导入elasticsearch。
首先,我想补充一下,我复制了PHP生成的导入数据格式,并将其粘贴到Sense中,批量导入就可以了。但是,通过使用cSense中使用的相同方法,通过cURL将相同数据发送到相同链接,我收到以下错误消息:
{"_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存储库(甚至搜索了它们在其中如何进行批量存储,这与我的方法类似),但是我现在宁愿根据自己的需要编写自己的方法和库。现在不需要完整的elastic-php库。
我究竟做错了什么?
最佳答案
您是否考虑过ES文档中写的那样,在向_bulk端点发送请求时,应将Content-Type header 设置为application / x-ndjson
ES bulk Docs
可能是您正在使用CURLOPT_CUSTOMREQUEST => "GET"
,但对ES的真正请求是POST。
根据DOCS的说法,这可能导致libcurl发送无效请求,并可能使远程服务器严重混乱
CURL_OPT DOCS
如果其中一种方法可行,请告诉我,我将答案编辑为正确的方法
关于php - Elasticsearch-PHP批量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44943324/