Testing Solr update XML messages
Testing Solr update XML messages
Join the DZone community and get the full member experience.Join For Free
Secure your Java app or API service quickly and easily with Okta's user authentication and authorization libraries. Developer accounts are free forever. Try Okta Instead.
For most clients these commands are actually translated into Solr XML update messages. Taking a look at the documentation in the Solr wiki (http://wiki.apache.org/solr/UpdateXmlMessages) shows all the options available. It also shows that it is possible to combine multiple commands in a single request.
So if you need to do several deletes and add some documents this can all be done in a single request. This got me wondering, how does this actually work? Are all ‘commands’ executed in the order of the XML message?
To test this I have created a very simple Solr index with just two fields:
- id (int)
- name (string)
For posting XML update messages I use Curl:
curl http://localhost:8983/solr/core0/update? -H "Content-Type: text/xml" --data-binary @data.xml
This is the content of the data.xml file:
<update> <delete> <query>*:*</query> </delete> <add> <doc> <field name="id">1</field> <field name="name">item 1</field> </doc> <doc> <field name="id">2</field> <field name="name">item 2</field> </doc> <doc> <field name="id">3</field> <field name="name">item 3</field> </doc> </add> <commit/> </update>
The index can easily be reset by re-posting this XML. The delete all query ensures a complete cleanup.
For testing a complex update I created this XML:
<update> <delete> <id>3</id> </delete> <commit/> <add> <doc> <field name="id">4</field> <field name="name">item 4</field> </doc> </add> <rollback/> <add> <doc> <field name="id">5</field> <field name="name">item 5</field> </doc> <doc> <field name="id">6</field> <field name="name">item 6</field> </doc> </add> <delete> <id>1</id> </delete> <commit/> <optimize/> </update>
The expected behaviour is:
- we start with [1,2,3] in the index.
- we delete document 3 and commit, so we now have [1,2]
- add document 4 and rollback, so no change: [1,2]
- add document 5 and 6, delete 1 and commit+optimize: [2, 5, 6]
The outcome: just as expected! After posting the update the index contains document 2, 5 and 6. So Solr does handle the commands in the update XML message in the exact given order.
An important note: this example was made to test Solr. In most cases where the order of the commands matters something is wrong. In this test the order only matters because of the add and rollback of document 4. But in that case document 4 shouldn’t be in the update anyway. And normally you should only commit once, below all add/delete commands.
The other parts of this test are more useful. Like using Curl for testing XML update messages and adding multiple commands to a single update message. The most obvious example is adding multiple documents in a single update, and most clients support this. But combining multiple delete queries or even combining delete queries with adding of documents is not supported by most clients, while it can save a lot of requests.
There is a downside though, if any command fails everything below it will not be executed.
Published at DZone with permission of Bas De Nooijer , DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.