通过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>