php - Elasticsearch-PHP批量

标签 php curl elasticsearch

我正在尝试批量-通过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/

相关文章:

php - Facebook、Twitter 等。登录网站不获取电子邮件

php - 在 Raspberry Pi 上强制自动启动应用程序

linux - cURL 不发送文件数据

php - 使用 Shopify API 获取所有产品(超过 50,000)

windows - nginx 的密码文件应该放在哪里

php - 正则表达式替换特定标记中所有出现的单个字符

php - 使用 Joomla + PHP 使用 MYSQL 中的图像存储进行缓存

json - Postman中Elasticsearch的不正确curl语法

elasticsearch - Elasticsearch bool过滤器和minimum_should_match选项

c# - NEST中的NOT LIKE查询