Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

solrj api for partial document update

Tags:

solr

solrj

Solr 4 beta is out, the GA version will follow soon. Partial document updates has been around for a while as explained here: http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/

However, I haven't figured out how to do it with solrj api.

Does anyone knows if it is possible with solrj? Or is solrj just not up-to-speed with this feature?

update: as I describe in the mailing list (see reply here), I found that in the solrj api, the value of a SolrInputField can be a map - it doesn't have to be a simple scalar value. If it is a map, solrj adds an additional update attribute to the field's xml element. For example, This code:

SolrInputDocument doc = new SolrInputDocument(); Map<String, String> partialUpdate = new HashMap<String, String>(); partialUpdate.put("set", "foo"); doc.addField("id", "test_123"); doc.addField("description", partialUpdate); 

yields this document:

<doc boost="1.0">     <field name="id">test_123</field>     <field name="description" update="set">foo</field> </doc> 

In this example I used the word "set" for this additional attribute, but it doesn't work. Solr doesn't update the field as I expected. According to this link: http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ valid values are "set" and "add".

Any idea?

like image 798
Yoni Avatar asked Aug 29 '12 17:08

Yoni


1 Answers

As it turns out, the code snippet shown above in the question actually works. I don't know what was wrong the first time I tried it, perhaps I simply forgot to commit or my schema was misconfigured.

In any case, this question is very localized. However, since the api with the hash map is so poorly documented, I thought maybe it is worth to keep this question and answer.

The key of the hash map can be one of three values:

  • set - to set a field.
  • add - to add to a multi-valued field.
  • inc - to increment a field.

There is an example of this code in the solrj unit tests, in a method called testUpdateField.

like image 144
Yoni Avatar answered Oct 31 '22 14:10

Yoni