Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add document to Apache Solr via PHP cURL

Tags:

php

curl

solr

I don't know what I have done wrong. The record does not get added.

Here is my code:

$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);

And here is the response that I get from Solr:

{"responseHeader":{"status":0,"QTime":4}}
like image 398
invisal Avatar asked Dec 19 '22 14:12

invisal


2 Answers

Apparently, I need to ask Apache Solr to commit the document. It does not auto commit the document or maybe I don't know how to config for it to auto commit. The following is the working example. Hope it will help to those who has the same problem.

$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);
like image 88
invisal Avatar answered Dec 28 '22 08:12

invisal


So not clear what version of Solr you are using, 3.X or 4.X (they differ in how they deal with commits but will cover both). In either case these are changes you can make in the solrconfig.xml file

For 3.x you can specify Autocommit in either number of documents or number of milliseconds or both. After hitting the threshold Solr will commit your changes so you don't have to in your code:

 <!-- 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>

For 4.X you also have the SoftCommit option. It makes the changes available to searches prior to syncing to disk:

 <!-- SoftAutoCommit

         Perform a 'soft' commit automatically under certain conditions.
         This commit avoids ensuring that data is synched to disk.

         maxDocs - Maximum number of documents to add since the last
                   soft commit before automaticly triggering a new soft commit.

         maxTime - Maximum amount of time in ms that is allowed to pass
                   since a document was added before automaticly
                   triggering a new soft commit.
      -->

     <autoSoftCommit>
       <maxTime>1000</maxTime>
     </autoSoftCommit>

I've found that thinking thru and implementing these settings in solrconfig.xml instead of depending upon application code level commits makes for a more predictable outcome.

A more complete discussion on Solr commits can be found here:

http://wiki.apache.org/solr/SolrConfigXml#Update_Handler_Section http://searchhub.org/2013/08/23/understanding-transaction-logs-softcommit-and-commit-in-sorlcloud/

like image 25
John Petrone Avatar answered Dec 28 '22 07:12

John Petrone