Solr 5.1 Features


Solr 5.1 has been released! Here’s an overview of how to use some of the new features.

Also see Solr download links and upcoming features of the next Solr release.

New Facet Module

The new facet module has a native JSON Facet API,
first-class support for statistics and analytics via facet functions (aggregations), and supports unlimited nesting of facets within other facets via sub-facets.

One can calculate statistics such as averages, number of unique values (distinct values), and percentiles over each facet bucket (groups of documents), and even sort facet buckets by any calculated metrics.

New JSON Request API

A JSON Request API that allows passing a full Solr query request in JSON.

Example:

curl http://localhost:8983/solr/query -d '
{
  query : "*:*",
  filter : [
    "author:brandon",
    "genre_s:fantasy"
  ],
  offset : 0,
  limit : 5,
  fields : ["title","author"],  // we could also use the string form "title,author"
  sort : "sequence_i desc",
 
  facet : {  // the JSON Facet API is nicely integrated as well
    avg_price : "avg(price)",
    median_price : "percentile(price,50)",
    top_authors : {terms : author}
  }
}'

Parameter Substitution / Macro Expansion

Parameter substitution is now done across the entire query request. It supports default values, multiple levels of indirection, and it even works within the body of a JSON request. This can also be viewed as a powerful form of request templates.

Example:

q=price:[ ${low} TO ${high} ]
&low=100
&high=200

Parameters can also be passed in the params block of a JSON request.

Constant Score Query Syntax

Syntax within the standard lucene/solr query parser for constant score queries quit the general form of <clause>^=<constant_score>. Think of a query boost with ^ replaced with ^=.
Example:

q=(color:blue color:green)^=2.0 text:shoes

Streaming API

There is a new general purpose parallel computing framework for SolrCloud. The Streaming API is (currently) a Java API that can do streaming aggregations (like sum and average) and streaming transformations (like group-by and join).

Admin UI Segment Info

The admin UI can show segment info such as size, number of docs, and number of deletions for each segment in the index.
For the “demo” collection, simply point your browser at
http://localhost:8983/solr/#/demo/segments
Or click on the “Segments Info” link in the admin UI after you select the core/collection you are interested in.
segments_info

Schema API can remove and replace fields

The bulk schema API how has the ability to replace or remove fields, fieldTypes, dynamic fields, and copy fields.

Example of adding a field (this was already possible):

curl http://localhost:8983/solr/demo/schema -d '
{
  "add-field":{
     "name" : "powerLevel",
     "type" : "int",
     "indexed" : true,
     "stored" : true
 }
}'

Now we can replace the field definition:

curl http://localhost:8983/solr/demo/schema -d '
{
  "replace-field":{
     "name" : "powerLevel",
     "type" : "int",
     "indexed" : false,
     "stored" : true
 }
}'

We can verify that Solr now has the updated field definition with

curl http://localhost:8983/solr/demo/schema/fields/powerLevel

And solr returns:

  "field":{
    "name":"powerLevel",
    "type":"int",
    "indexed":false,
    "stored":true}

And lastly, we can delete the field definition with

curl http://localhost:8983/solr/demo/schema -d '
{
  "delete-field":{ "name" : "powerLevel" }
}'

Spatial Heatmap Faceting

Solr can now execute a two dimensional facet on RPT field types (Spatial Recursive Prefix Tree).

Parameters Example:

q=*:*
&facet=true
&facet.heatmap=location_rpt
&facet.heatmap.geom=["-180 -90" TO "180 90"]
&facet.heatmap.gridLevel=6
&facet.heatmap.distErrPct=0.15
&facet.heatmap.format=ints2D

The facet.heatmap.format=ints2D parameter causes a 2D array of counts to be returned:

{
"counts_ints2D":[[4, 0, 1, 3, ....],[2, 0, 1, 2, ...],...]
}

If facet.heatmap.format=png is passed instead, a basic base64-encoded PNG (picture) will be returned of the heatmap grid.

Real-Time Get in SolrJ

There is now an explicit API in SolrJ to use Real-time Get

HttpSolrClient client = new HttpSolrClient("http://localhost:8983/solr/demo");

SolrDocument sdoc = client.getById("book1");
System.out.println("I found book " + sdoc);

client.close(); // shut down the client when we are done

StatsComponent Enable/disable individual stats

Localparams may now be used to selectively enable or disable specific stats in the StatsComponent.
Example: stats.field={!min=true max=true}field_name

Percentiles

Both the new facet module and the stats component gained support for percentiles.

json.facet={ median_age : "percentile(age,50)" } 
stats.field={!percentiles='50'}age

Configuration API expansion

Many additional configuration items can now be managed via the Config API.
This includes managing named components such as requestHandler, queryParser, queryResponseWriter, valueSourceParser, transformer, and queryConverter.

Changes do not directly change solrconfig.xml, but instead are reflected in configoverlay.json which override settings in solrconfig.xml.

Upload config sets to zookeeper with CloudSolrClient

Named config sets (schema.xml, solrconfig,xml, etc) are referenced by name when creating new collections in SolrCloud.
These config sets may now be uploaded and downloaded via SolrJ to and from the local filesystem. The following methods were added to CloudSolrClient:

  public void uploadConfig(Path configPath, String configName);
  public void downloadConfig(String configName, Path downloadPath);

API to add JAR to classpath

There is a new API to add a jar to a collection’s classpath (as well as update and delete a jar).
Components that depend on such a jar should have a new attribute called runtimeLib set to true since a separate classloader is used for these jars.

Example of uploading a jar:

curl http://localhost:8983/solr/demo/config -d '{
"add-runtimelib" : {"name": "jarname" , "version":2 }
}'

Example registering a new value source parser using a class in the jar:

curl http://localhost:8983/solr/demo/config -d '{
  "create-valuesourceparser" : {
    "name": "nvl",
    "runtimeLib" : true, 
    "class" : "solr.org.apache.solr.search.function.NvlValueSourceParser , 
    "nvlFloatValue" : 0.0 
  }  
}'