通过PHP cURL向Apache Solr添加文档
我不知道我做错了什么。该记录不会被添加 这是我的密码:通过PHP cURL向Apache Solr添加文档,php,curl,solr,Php,Curl,Solr,我不知道我做错了什么。该记录不会被添加 这是我的密码: $ch = curl_init("http://127.0.0.1:8983/solr/collection1/update/json?commit=true"); $data = array( "add" => array( "doc" => array( "id" => "HW132", "name" => "Hello World" )) ); $data_
$ch = curl_init("http://127.0.0.1:8983/solr/collection1/update/json?commit=true");
$data = array(
"add" => array( "doc" => array(
"id" => "HW132",
"name" => "Hello World"
))
);
$data_string = json_encode($data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$response = curl_exec($ch);
以下是我从Solr那里得到的回应:
{"responseHeader":{"status":0,"QTime":4}}
显然,我需要让ApacheSolr提交文档。它不会自动提交文档,或者我不知道如何配置它以自动提交。以下是工作示例。希望它能帮助那些有同样问题的人
$ch = curl_init("http://127.0.0.1:8983/solr/collection1/update?wt=json");
$data = array(
"add" => array(
"doc" => array(
"id" => "HW2212",
"title" => "Hello World 2"
),
"commitWithin" => 1000,
),
);
$data_string = json_encode($data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$response = curl_exec($ch);
因此,不清楚您使用的Solr版本是3.X还是4.X(它们在处理提交的方式上有所不同,但将涵盖这两个版本)。在这两种情况下,您都可以在solrconfig.xml文件中进行更改 对于3.x,您可以指定自动提交的文档数或毫秒数或两者。达到阈值后,Solr将提交您的更改,这样您就不必在代码中:
<!-- autocommit pending docs if certain criteria are met. Future versions may expand the available
criteria -->
<autoCommit>
<maxDocs>10000</maxDocs> <!-- maximum uncommited docs before autocommit triggered -->
<maxTime>15000</maxTime> <!-- maximum time (in MS) after adding a doc before an autocommit is triggered -->
<openSearcher>false</openSearcher> <!-- SOLR 4.0. Optionally don't open a searcher on hard commit. This is useful to minimize the size of transaction logs that keep track of uncommitted updates. -->
</autoCommit>
我试图发布一个xml,但我不知道下面的解决方案为什么有效。文档中说我应该使用“@”plus文件路径来上传文件,但它不起作用。所以我就这样做了:
<?php
$url = 'http://localhost:8080/solr/update/?commit=true';
$file = realpath('/home/fabio/target_file.xml');
$header = array(
"Content-Type: text/xml",
);
$post = file_get_contents($file);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
echo curl_exec($ch);
curl_close($ch);
POST/solr/update/?commit=true HTTP/1.1
主机:本地主机:8080
接受:*/*
内容类型:text/xml
内容长度:3502
预期:100人继续
<?php
$url = 'http://localhost:8080/solr/update/?commit=true';
$file = realpath('/home/fabio/target_file.xml');
$header = array(
"Content-Type: text/xml",
);
$post = file_get_contents($file);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
echo curl_exec($ch);
curl_close($ch);
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /solr/update/?commit=true HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Type: text/xml
Content-Length: 3502
Expect: 100-continue
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: application/xml;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 19 Jan 2016 16:52:19 GMT
<
* Connection #0 to host localhost left intact
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">269</int></lst>
</response>