Solr Component
Available as of Camel 2.9
The Solr component allows you to interface with an Apache Lucene Solr server.
Maven users will need to add the following dependency to their pom.xml
for this component:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-solr</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
URI format
solr://host[:port]/solr?[options]
Endpoint Options
The following SolrServer options may be configured on the Solr endpoint.
name |
default value |
description |
---|---|---|
maxRetries |
0 |
maximum number of retries to attempt in the event of transient errors |
soTimeout |
1000 |
read timeout on the underlying HttpConnectionManager. This is desirable for queries, but probably not for indexing |
connectionTimeout |
100 |
connectionTimeout on the underlying HttpConnectionManager |
defaultMaxConnectionsPerHost |
2 |
maxConnectionsPerHost on the underlying HttpConnectionManager |
maxTotalConnections |
20 |
maxTotalConnection on the underlying HttpConnectionManager |
followRedirects |
false |
indicates whether redirects are used to get to the Solr server |
allowCompression |
false |
server side must support gzip or deflate for this to have any effect |
requestHandler |
/update (xml) |
set the request handler to be used |
Message Operations
The following Solr operations are currently supported. Simply set an exchange header with a key of "SolrOperation" and a value set to one of the following. Some operations also require the message body to be set.
operation |
message body |
description |
---|---|---|
INSERT |
n/a |
insert a new record based on headers values (headers must be prefixed with "SolrField.") |
ADD_BEAN |
bean instance |
insert a new record based on values in an annotated bean |
DELETE_BY_ID |
index id to delete |
delete a record by ID |
DELETE_BY_QUERY |
query string |
delete a record by a query |
COMMIT |
n/a |
performs a commit on any pending index changes |
ROLLBACK |
n/a |
performs a rollback on any pending index changes |
OPTIMIZE |
n/a |
performs a commit on any pending index changes and then runs the optimize command |
Example
Below is a simple INSERT and COMMIT example
from("direct:insert") .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_INSERT)) .setHeader(SolrConstants.FIELD + "id", body()) .to("solr://localhost:8983/solr"); from("direct:commit") .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT)) .to("solr://localhost:8983/solr");
<route> <from uri="direct:insert"/> <setHeader headerName="SolrOperation"> <constant>INSERT</constant> </setHeader> <setHeader headerName="SolrField.id"> <simple>${body}</simple> </setHeader> <to uri="solr://localhost:8983/solr"/> </route> <route> <from uri="direct:commit"/> <setHeader headerName="SolrOperation"> <constant>COMMIT</constant> </setHeader> <to uri="solr://localhost:8983/solr"/> </route>
A client would simply need to pass a body message to the insert route and then call the commit route.
template.sendBody("direct:insert", "1234"); template.sendBody("direct:commit", null);
Querying Solr
Currently, this component doesn't support querying data natively (may be added later). For now, you can query Solr using HTTP as follows:
//define the route to perform a basic query from("direct:querySolr") .recipientList(simple("http://localhost:8983/solr/select/?q=${body}")) .convertBodyTo(String.class); ... //query for an id of '1234' String responseXml = (String) template.requestBody("direct:querySolr", "id:1234");
For more information, see these resources...