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}}
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);
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With