Solr
Since Camel 2.9
The Solr component allows you to interface with an Apache Lucene Solr server (based on SolrJ 3.5.0).
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
NOTE: solrs and solrCloud are new added since Camel 2.14.
solr://host[:port]/solr?[options]
solrs://host[:port]/solr?[options]
solrCloud://host[:port]/solr?[options]
Solr Options
The Solr component has no options.
The Solr endpoint is configured using URI syntax:
solr:url
with the following path and query parameters:
Path Parameters (1 parameters):
Name | Description | Default | Type |
---|---|---|---|
url |
Required Hostname and port for the solr server |
String |
Query Parameters (15 parameters):
Name | Description | Default | Type |
---|---|---|---|
allowCompression (producer) |
Server side must support gzip or deflate for this to have any effect |
Boolean |
|
connectionTimeout (producer) |
connectionTimeout on the underlying HttpConnectionManager |
Integer |
|
defaultMaxConnectionsPer Host (producer) |
maxConnectionsPerHost on the underlying HttpConnectionManager |
Integer |
|
followRedirects (producer) |
indicates whether redirects are used to get to the Solr server |
Boolean |
|
maxRetries (producer) |
Maximum number of retries to attempt in the event of transient errors |
Integer |
|
maxTotalConnections (producer) |
maxTotalConnection on the underlying HttpConnectionManager |
Integer |
|
requestHandler (producer) |
Set the request handler to be used |
String |
|
soTimeout (producer) |
Read timeout on the underlying HttpConnectionManager. This is desirable for queries, but probably not for indexing |
Integer |
|
streamingQueueSize (producer) |
Set the queue size for the StreamingUpdateSolrServer |
10 |
int |
streamingThreadCount (producer) |
Set the number of threads for the StreamingUpdateSolrServer |
2 |
int |
synchronous (advanced) |
Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). |
false |
boolean |
password (security) |
Sets password for basic auth plugin enabled servers |
String |
|
username (security) |
Sets username for basic auth plugin enabled servers |
String |
|
collection (solrCloud) |
Set the collection name which the solrCloud server could use |
String |
|
zkHost (solrCloud) |
Set the ZooKeeper host information which the solrCloud could use, such as zkhost=localhost:8123. |
String |
Spring Boot Auto-Configuration
When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-solr-starter</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
The component supports 2 options, which are listed below.
Name | Description | Default | Type |
---|---|---|---|
camel.component.solr.enabled |
Enable solr component |
true |
Boolean |
camel.component.solr.resolve-property-placeholders |
Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. |
true |
Boolean |
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.
-
the INSERT operations use the CommonsHttpSolrServer
-
the INSERT_STREAMING operations use the StreamingUpdateSolrServer (Camel 2.9.2)
Operation | Message body | Description |
---|---|---|
INSERT/INSERT_STREAMING |
n/a |
adds an index using message headers (must be prefixed with "SolrField.") |
INSERT/INSERT_STREAMING |
File |
adds an index using the given File (using ContentStreamUpdateRequest) |
INSERT/INSERT_STREAMING |
SolrInputDocument |
Camel 2.9.2 updates index based on the given SolrInputDocument |
INSERT/INSERT_STREAMING |
String XML |
Camel 2.9.2 updates index based on the given XML (must follow SolrInputDocument format) |
ADD_BEAN |
bean instance |
adds an index based on values in an annotated bean |
ADD_BEANS |
collection<bean> |
Camel 2.15 adds index based on a collection of 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, DELETE 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:delete")
.setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_DELETE_BY_ID))
.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:delete"/>
<setHeader headerName="SolrOperation">
<constant>DELETE_BY_ID</constant>
</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 or delete routes and then call the commit route.
template.sendBody("direct:insert", "1234");
template.sendBody("direct:commit", null);
template.sendBody("direct:delete", "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:query")
.recipientList(simple("http://localhost:8983/solr/select/?q=${body}"))
.convertBodyTo(String.class);
...
//query for an id of '1234' (url encoded)
String responseXml = (String) template.requestBody("direct:query", "id%3A1234");
For more information, see these resources…