<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Solr &apos;n Stuff | Blog</title><description>Open source search and analytics</description><link>https://yonik.com/</link><language>en</language><atom:link rel="self" href="https://yonik.com/blog/rss.xml"/><atom:link rel="prev-archive" href="https://yonik.com/blog/rss/2017-09.xml"/><item><title>Solr 7.1 Features</title><link>https://yonik.com/blog/solr-7-1/</link><guid isPermaLink="true">https://yonik.com/blog/solr-7-1/</guid><pubDate>Sun, 03 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 7.1:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;json-query-syntax--json-query-dsl&quot;&gt;JSON Query Syntax / JSON Query DSL&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;There is now a JSON mapping to Solr QParsers. Currently, one must use the &lt;a href=&quot;https://yonik.com/blog/solr-json-request-api/&quot;&gt;JSON Request API&lt;/a&gt; to use this JSON syntax, but SOLR-11295 will provide a more general purpose entry point to JSON syntax in the future.&lt;/p&gt;
&lt;p&gt;The general form of a query type in existing &lt;code dir=&quot;auto&quot;&gt;local params&lt;/code&gt; syntax is:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{!query_type param1=val1 param2=val2}query_value&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;OR, specifying the main query value using the &lt;code dir=&quot;auto&quot;&gt;v&lt;/code&gt; parameter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{!query_type param1=val1 param2=val2 v=query_value}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In the new &lt;code dir=&quot;auto&quot;&gt;JSON syntax&lt;/code&gt;, the corresponding mappings would be&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{query_type:{param1:&lt;/span&gt;&lt;span&gt;val1&lt;/span&gt;&lt;span&gt;, param2:&lt;/span&gt;&lt;span&gt;val2&lt;/span&gt;&lt;span&gt;, v:&lt;/span&gt;&lt;span&gt;query_value&lt;/span&gt;&lt;span&gt;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;OR using &lt;code dir=&quot;auto&quot;&gt;query&lt;/code&gt; (which is a synonym for &lt;code dir=&quot;auto&quot;&gt;v&lt;/code&gt; when mapping to local params)&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{query_type:{param1:&lt;/span&gt;&lt;span&gt;val1&lt;/span&gt;&lt;span&gt;, param2:&lt;/span&gt;&lt;span&gt;val2&lt;/span&gt;&lt;span&gt;, query:&lt;/span&gt;&lt;span&gt;query_value&lt;/span&gt;&lt;span&gt;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;  Here’s an example of a pseudo-join query in local-params syntax that queries for book_review1 and follows the “book_id” field of the result(s) to the matching “id” field:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl http://localhost:8983/solr/techproducts/query -d &apos;q={!join from:book_id to:id}id:book_review1&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In JSON syntax (indented for better readability), this would be&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/techproducts/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;join:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from : &lt;/span&gt;&lt;span&gt;book_id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;to : &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id:book_review1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note that the &lt;code dir=&quot;auto&quot;&gt;query&lt;/code&gt; parameter is specified in lucene syntax above, but it can be any query in local-params syntax or JSON syntax. Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/techproducts/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;join:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from : &lt;/span&gt;&lt;span&gt;book_id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;to : &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query : { field : {f:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, v:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book_review1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;} }  &lt;/span&gt;&lt;span&gt;// invokes the &quot;field&quot; QParser&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;integral-and-date-type-support-for-minmax&quot;&gt;Integral and date type support for min/max&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Min and max aggregations in the &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt; have been updated to include support for int, long, and date types. Previously, min and max of all of these field types returned double results.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;auto-scaling-enhancements&quot;&gt;Auto-scaling enhancements&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Solr’s auto-scaling framework contains a number of new features and improvements, including&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to move replicas when nodes are added or removed to the cluster.&lt;/li&gt;
&lt;li&gt;Solr’s autoAddReplicas feature now uses the autoscaling framework and works for all filesystems.&lt;/li&gt;
&lt;li&gt;New API to control triggers and listeners (set-trigger, remove-trigger, suspend-trigger, set-listener, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As of this writing, the Solr 7.1 reference guide is not published yet. However you can check out the auto-scaling section of the very latest version of the unreleased &lt;a href=&quot;https://builds.apache.org/job/Solr-reference-guide-master/javadoc/solrcloud-autoscaling.html&quot;&gt;reference guide&lt;/a&gt; for the master branch.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;polygons-in-spatial-rpt-fields&quot;&gt;Polygons in Spatial RPT fields&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Here’s an example field using the new &lt;code dir=&quot;auto&quot;&gt;Geo3D&lt;/code&gt; spatialContextFactory that supports polygons:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;fieldType name=&quot;srptgeom_geo3d&quot; class=&quot;solr.RptWithGeometrySpatialField&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;spatialContextFactory=&quot;Geo3D&quot; planetModel=&quot;wgs84&quot;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note: “wgs84” is an &lt;a href=&quot;https://en.wikipedia.org/wiki/World_Geodetic_System&quot;&gt;ellipsoid coordinate system for the Earth&lt;/a&gt; used by GPS. “sphere” can also be used for a spherical model that has faster but less accurate distance calculations.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;streaming-expressions-functions&quot;&gt;Streaming Expressions functions&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Expanded support for statistical functions including various distributions, rank correlations, distances and more:&lt;/p&gt;
&lt;p&gt;harmonicFit, polyfit, polyfitDerivative, betaDistribution, gammaDistribution, zipFDistribution, logNormalDistribution, weibullDistribution, monteCarlo, expMovingAverage, binomialCoefficient, factorial, movingMedian, primes, sumDifference, meanDifference, ebeAdd, ebeSubtract, ebeDivide, ebeMultiply, dotProduct, cosineSimilarity, Canberra, Chebyshev, Earth Movers and Manhattan Distance, Kendall’s Tau-b rank and Spearmans rank, discrete counting and probability, cumulativeProbability, normalDistribution, uniformDistribution, kolmogorovSmirnov, addAll&lt;/p&gt;
</content:encoded></item><item><title>Solr 8 Features</title><link>https://yonik.com/blog/solr-8/</link><guid isPermaLink="true">https://yonik.com/blog/solr-8/</guid><pubDate>Sun, 03 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in the next major upcoming release: Solr 8.0 &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download a Solr 8 nightly build&lt;/a&gt; to try these features out and give us feedback!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;in-progress&quot;&gt;IN PROGRESS&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We’re in the progress of releasing Solr 7, so there’s not much new here yet. Check back later!&lt;/p&gt;
</content:encoded></item><item><title>Solr 6.6 Features</title><link>https://yonik.com/blog/solr-6-6/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6-6/</guid><pubDate>Fri, 02 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.6, released on June 6, 2017.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6.6&lt;/a&gt; to try these features out and give us feedback! You can also check out &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is likely to be the last Solr 6.x release before &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;Solr 7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;  The release notes from the Apache Solr Wiki:&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;fields-and-field-types&quot;&gt;Fields and field types&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Payload support with payload() value source and {!payload_score} and {!payload_check} query parsers&lt;/li&gt;
&lt;li&gt;Solr support for SimpleTextCodec, via in solrconfig.xml (per-field specification in the schema is not possible)&lt;/li&gt;
&lt;li&gt;Multi-field support to TermsComponent when requesting terms’ statistics&lt;/li&gt;
&lt;li&gt;Support for PointFields in Grouping, CollapseQParser, and ExpandComponent.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;new-api&quot;&gt;New API&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;UPLOAD command (Config Set API) for uploading zipped configsets&lt;/li&gt;
&lt;li&gt;MOVEREPLICA command (Collections API) for moving a replica across nodes&lt;/li&gt;
&lt;li&gt;LISTALIASES command (Collections API) to return a list of all collection aliases&lt;/li&gt;
&lt;li&gt;STATUS command (Core Admin API) to emit collection details of each core&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;script&quot;&gt;Script&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Basic authentication can be enabled/disabled using bin/solr|bin/solr.cmd&lt;/li&gt;
&lt;li&gt;ls command to ZkCLI for listing only sub-directories&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;faceting&quot;&gt;Faceting&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Variance and Standard Deviation aggregators for the JSON Facet API&lt;/li&gt;
&lt;li&gt;JSON Faceting now supports a query time ‘join’ domain change option&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;streaming-expressions-and-evaluators&quot;&gt;Streaming expressions and evaluators&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;CartesianProductStream, which turns a single tuple with a multi-valued field into N tuples, one for each value in the multi-valued field&lt;/li&gt;
&lt;li&gt;stats and search Streaming Expressions should now work in non-SolrCloud mode&lt;/li&gt;
&lt;li&gt;analyze Stream Evaluator to support streaming NLP&lt;/li&gt;
&lt;li&gt;New Stream Evaluators: Basic math, Date/time, UUID, Correlation, regress, predict, covariance, convolution, normalize&lt;/li&gt;
&lt;li&gt;New Streaming Expressions: shuffle, echo, eval, timeseries, let, get&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;examples&quot;&gt;Examples&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Solr default/example uses WordDelimiterGraphFilterFactory and SynonymGraphFilterFactory&lt;/li&gt;
&lt;li&gt;New DataImportHandler ‘atom’ example, replacing broken ‘rss’ example&lt;/li&gt;
&lt;li&gt;Redone DataImportHandler ‘tika’ example, removing all unused and irrelevant definitions&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;metrics&quot;&gt;Metrics&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Expose cache statistics using metrics API&lt;/li&gt;
&lt;li&gt;Improvements to metric reporters and API: support for “regex” parameter in /admin/metrics, “enabled” flag in reporter configurations, correct handling of “serviceUrl” in SolrJmxReporter, better handling of service clients for JMX, Ganglia and Graphite reporters&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;upgradesdeprecationsremovals&quot;&gt;Upgrades/deprecations/removals&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Deprecated LatLonType, GeoHashField, SpatialPointVectorFieldType, and SpatialTermQueryPrefixTreeFieldType. Instead, switch to LatLonPointSpatialField or SpatialRecursivePrefixTreeFieldType or RptWithGeometrySpatialField&lt;/li&gt;
&lt;li&gt;Deprecated PostingsSolrHighlighter. Use UnifiedSolrHighlighter instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;solrj&quot;&gt;SolrJ&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;CloudSolrClient can now be initialized using the base URL of a Solr instance instead of ZooKeeper hosts&lt;/li&gt;
&lt;li&gt;SolrJ: Added SolrParams.toLocalParamsString() and ClientUtils.encodeLocalParamVal&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;others&quot;&gt;Others&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New AtomicUpdateProcessor to convert normal update operations to atomic update operations&lt;/li&gt;
&lt;li&gt;totalTermFreq support to TermsComponent&lt;/li&gt;
&lt;li&gt;Hide keystore and truststore passwords from /admin/info/* outputs&lt;/li&gt;
&lt;li&gt;Configurability for thread pool size to recoveryExecutor&lt;/li&gt;
&lt;li&gt;Introducing sort=childfield(field) asc for searching by {!parent}&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;optimizations&quot;&gt;Optimizations&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;facet.heatmap is now significantly faster when the docset (base query) matches everything and there are no deleted docs. It is also faster when the docset matches a small fraction of the index or none&lt;/li&gt;
&lt;li&gt;Reduced heap consumption for filter({!join … score=…})&lt;/li&gt;
&lt;li&gt;JSON Facet API now uses hyper-log-log++ for determining the number of buckets when merging requests from a multi-shard distributed request&lt;/li&gt;
&lt;li&gt;Better ZkStateWriter batching&lt;/li&gt;
&lt;li&gt;Using cache for DistributedQueue in case of single-consumer&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Solr 6.5 Features</title><link>https://yonik.com/blog/solr-6-5/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6-5/</guid><pubDate>Mon, 23 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.5. &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6.5&lt;/a&gt; to try these features out and give us feedback!&lt;/p&gt;
&lt;p&gt;This feature list was adapted from the release notes on the wiki: &lt;a href=&quot;https://wiki.apache.org/solr/ReleaseNote65&quot;&gt;https://wiki.apache.org/solr/ReleaseNote65&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;field-type-related-changes&quot;&gt;Field Type related changes&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;PointFields (fixed-width multi-dimensional numeric &amp;#x26; binary types enabling fast range search) are now supported&lt;/li&gt;
&lt;li&gt;In-place updates to numeric docValues fields (single valued, non-stored, non-indexed) supported using atomic update syntax&lt;/li&gt;
&lt;li&gt;A new LatLonPointSpatialField that uses points or doc values for query&lt;/li&gt;
&lt;li&gt;It is now possible to declare a field as “large” in order to bypass the document cache&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;query&quot;&gt;Query&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New sow=false request param (split-on-whitespace) for edismax &amp;#x26; standard query parsers enables query-time multi-term synonyms&lt;/li&gt;
&lt;li&gt;XML QueryParser (defType=xmlparser) now supports span queries&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;highlighting&quot;&gt;Highlighting&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;hl.maxAnalyzedChars now have consistent default across highlighters&lt;/li&gt;
&lt;li&gt;UnifiedSolrHighlighter and PostingsSolrHighlighter now support CustomSeparatorBreakIterator&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;streaming-expressions&quot;&gt;Streaming Expressions&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Scoring formula is adjusted for the scoreNodes function&lt;/li&gt;
&lt;li&gt;Calcite Planner now applies constant Reduction Rules to optimize plans&lt;/li&gt;
&lt;li&gt;A new significantTerms Streaming Expression that is able to extract the significant terms in an index&lt;/li&gt;
&lt;li&gt;StreamHandler is now able to use runtimeLib jars&lt;/li&gt;
&lt;li&gt;Arithmetic operations are added to the SelectStream&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;ease-of-use--admin-ui&quot;&gt;Ease of use / Admin UI&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added modernized self-documenting /v2 API&lt;/li&gt;
&lt;li&gt;The .system collection is now created on first request if it does not exist&lt;/li&gt;
&lt;li&gt;Admin UI: Added shard deletion button&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;metrics&quot;&gt;Metrics&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Metrics API now supports non-numeric metrics (version, disk type, component state, system properties…)&lt;/li&gt;
&lt;li&gt;The disk free and aggregated disk free metrics are now reported&lt;/li&gt;
&lt;li&gt;The DirectUpdateHandler2 now implements MetricsProducer and exposes stats via the metrics api and configured reporters.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;optimizations&quot;&gt;Optimizations&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;BlockCache is faster due to less failures when caching a new block&lt;/li&gt;
&lt;li&gt;MMapDirectoryFactory now supports “preload” option to ask mapped pages to be loaded into physical memory on init&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;misc-changes&quot;&gt;Misc Changes&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Security: BasicAuthPlugin now supports standalone mode&lt;/li&gt;
&lt;li&gt;Arbitrary java system properties can be passed to zkcli&lt;/li&gt;
&lt;li&gt;SolrHttpClientBuilder can be configured via java system property&lt;/li&gt;
&lt;li&gt;Javadocs and Changes.html are no longer included in the binary distribution, but are hosted online&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more detailed lists with pointers to JIRA issues, see the &lt;a href=&quot;http://lucene.apache.org/solr/6_5_0/changes/Changes.html&quot;&gt;HTML version of CHANGES.txt&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Facet Domains</title><link>https://yonik.com/blog/facet-domains/</link><guid isPermaLink="true">https://yonik.com/blog/facet-domains/</guid><description>Change the facet domain with block join (blockParent, blockChildren), excludeTags for multi-select faceting, or filter the domain in Solr&apos;s JSON Facet API</description><pubDate>Tue, 01 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h2 id=&quot;what-is-the-facet-domain&quot;&gt;What is the Facet Domain&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The domain of a facet is the set of values (normally defined by a set of documents) that calculations will be done over. The &lt;strong&gt;root domain&lt;/strong&gt; is the set of documents that match the base query and any filters.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;changing-the-facet-domain&quot;&gt;Changing the Facet Domain&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;For any facet command, one can use the &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; keyword to change the facet domain before facet computation.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;blockparent&quot;&gt;blockParent&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The existence of the &lt;code dir=&quot;auto&quot;&gt;blockParent&lt;/code&gt; parameter in the domain block will cause incoming child documents to be mapped to their parents. The value of the blockParent parameter is the &lt;code dir=&quot;auto&quot;&gt;parent filter&lt;/code&gt; that specifies the complete set of parent documents for this block join operation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/#Faceting_on_Parents&quot;&gt;Nested Documents -&gt; Faceting On Parents&lt;/a&gt; for an example.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;blockchildren&quot;&gt;blockChildren&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The existence of the &lt;code dir=&quot;auto&quot;&gt;blockChildren&lt;/code&gt; parameter in the domain block will cause incoming parent documents to be mapped to their children. The value of the blockChildren parameter is the &lt;code dir=&quot;auto&quot;&gt;parent filter&lt;/code&gt; that specifies the complete set of parent documents for this block join operation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/#Faceting_on_Children&quot;&gt;Nested Documents -&gt; Faceting On Children&lt;/a&gt; for an example.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;excludetags&quot;&gt;excludeTags&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;excludeTags&lt;/code&gt; parameter causes the domain to be &lt;code dir=&quot;auto&quot;&gt;re-calculated&lt;/code&gt; from the root all the way to the current point, but excluding any filters with the specified tags. This is normally used as part of &lt;a href=&quot;https://yonik.com/blog/multi-select-faceting/&quot;&gt;multi-select faceting&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;filter&quot;&gt;filter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;filter&lt;/code&gt; parameter is used to specify a filter or list of filters to be intersected with the incoming domain before faceting. These filters are applied &lt;strong&gt;after&lt;/strong&gt; other domain transformations such as blockParent, blockChildren, or excludeTags. The same exact syntax for &lt;code dir=&quot;auto&quot;&gt;filter&lt;/code&gt; is supported in the &lt;a href=&quot;https://yonik.com/blog/solr-json-request-api/&quot;&gt;JSON Request API&lt;/a&gt; for the top level document list (or will be after &lt;a href=&quot;https://issues.apache.org/jira/browse/SOLR-9733&quot;&gt;SOLR-9733&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain : { filter:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;user:yonik&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The “param” query type can be used to grab zero or more filters from a request parameter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;myfilt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;type:&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;myfilt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;rating:&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;user:yonik&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{param : &lt;/span&gt;&lt;span&gt;myfilt&lt;/span&gt;&lt;span&gt;} ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
</content:encoded></item><item><title>Solr 6.4 Features</title><link>https://yonik.com/blog/solr-6-4/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6-4/</guid><pubDate>Sun, 30 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.4.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6.4&lt;/a&gt; to try these features out and give us feedback! You can also check out &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;filter-list-for-facet-domain&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;filter&lt;/code&gt; list for facet domain&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Any &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON facet command&lt;/a&gt; (terms, range, query) can now &lt;a href=&quot;https://yonik.com/blog/facet-domains/#filter&quot;&gt;filter the facet domain&lt;/a&gt; in a simpler manner, without resorting to nested query facets.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain : { filter:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;user:yonik&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The filters are applied after other domain change operations and are particularly useful when &lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/&quot;&gt;faceting on child documents&lt;/a&gt;. The &lt;code dir=&quot;auto&quot;&gt;filter&lt;/code&gt; attribute can be a single query or a list of multiple queries to intersect.&lt;/p&gt;
&lt;p&gt;Using a &lt;code dir=&quot;auto&quot;&gt;param&lt;/code&gt; to refer to a filter by query parameter was added shortly after.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;learning-to-rank&quot;&gt;Learning to Rank&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Learning to Rank (LTR) plugin for reranking results with machine learning models.&lt;/p&gt;
&lt;p&gt;See the Lucene/Solr Revolution presentation &lt;a href=&quot;https://www.youtube.com/watch?v=M7BKwJoh96s&quot;&gt;Learning to Rank in Solr&lt;/a&gt; as well as the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Learning+To+Rank&quot;&gt;Solr Ref Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;snapshotclish-command-line-tool-to-manage-snapshots&quot;&gt;snapshotcli.sh command line tool to manage snapshots&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The full path of the script is &lt;code dir=&quot;auto&quot;&gt;./solr/server/scripts/cloud-scripts/snapshotscli.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;An example from the pull request:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Start solr and initialize a sample collection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bin/solr start -c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bin/solr create_collection -c books&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl &apos;http://localhost:8983/solr/books/update?commit=true&apos; -H &apos;Content-type:application/json&apos; -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[ {&quot;id&quot; : &quot;book1&quot;, &quot;title&quot; : &quot;American Gods&quot;, &quot;author&quot; : &quot;Neil Gaiman&quot; } ]&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//Create and export a snapshot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./snapshotscli.sh --create snap-1 -c books -z localhost:9983&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./snapshotscli.sh --list -c books -z localhost:9983&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./snapshotscli.sh --describe snap-1 -c books -z localhost:9983&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./snapshotscli.sh --export snap-1 -c books -z localhost:9983 -d /tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./snapshotscli.sh --delete snap-1 -c books -z localhost:9983&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Restore the backup and verify the doc count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl &apos;http://localhost:8983/solr/admin/collections?action=restore&amp;#x26;name=snap-1&amp;#x26;location=/tmp&amp;#x26;collection=books_restored&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl &apos;http://localhost:8983/solr/books_restored/select?q=*:*&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;more-efficient-filter-queries&quot;&gt;More efficient filter queries&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;When parsing filter queries (including &lt;code dir=&quot;auto&quot;&gt;fq&lt;/code&gt; parameters) the standard solr query parser will avoid using BooleanQuery for term disjunctions on string and numeric fields, and will use TermsQuery instead.&lt;/p&gt;
&lt;p&gt;This has a number of positive effects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoids Lucene’s dreaded static maxBooleanClauses issue that causes “too many boolean clauses” exceptions&lt;/li&gt;
&lt;li&gt;The resulting query should be smaller to cache&lt;/li&gt;
&lt;li&gt;The resulting query should have higher performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, the following filter will now be faster, and will no longer throw a “too many boolean clauses” exception:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fq=id:(myid1 myid2 myid3 myid4 ... myid2000)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;having-streaming-expression&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;having&lt;/code&gt; streaming expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;having&lt;/code&gt; streaming expression provides functionality like the SQL &lt;code dir=&quot;auto&quot;&gt;HAVING&lt;/code&gt; clause, and will be used to implement that in the future. Aggregated buckets produced by &lt;code dir=&quot;auto&quot;&gt;rollup&lt;/code&gt; are filtered by a having clause.&lt;/p&gt;
&lt;p&gt;The following streaming expression filters out buckets (authors) with less than 100,000 in sales across all of their books:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;having(rollup(over=author,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sum(sales),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search(book_sales_collection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q=*:*,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fl=&quot;author,sales&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sort=&quot;author asc&quot;)),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gte(sum(sales), 100000))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Also see the a &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Streaming+Expressions#StreamingExpressions-having&quot;&gt;streaming expressions&lt;/a&gt; documentation in the ref guide.&lt;/p&gt;
</content:encoded></item><item><title>Nested Objects in Solr</title><link>https://yonik.com/blog/solr-nested-objects/</link><guid isPermaLink="true">https://yonik.com/blog/solr-nested-objects/</guid><description>Indexing nested child documents / nested objects and querying with block join in Solr. Faceting on parent or child nested documents via the JSON Facet API.</description><pubDate>Wed, 26 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h2 id=&quot;nested-documents&quot;&gt;Nested Documents&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Nested Documents (also called Nested Objects) provides the ability to “nest” some documents inside of other documents in a parent/child relationship.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;why-nested-documents&quot;&gt;Why Nested Documents&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;One reason for using nested documents is to prevent false matches. For example, we may have a T-Shirt with 2 SKUs, a Large Red, and a Medium Blue.&lt;/p&gt;
&lt;p&gt;Say we tried to model this as a single document:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;product : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Awesome T-Shirt&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;color : [ &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Red&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Blue&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;size : [ &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;M&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now if we search for &lt;code dir=&quot;auto&quot;&gt;color:RED AND size:M&lt;/code&gt; , it would incorrectly match our document! But if we represented the SKUs as two different documents, then there would be no incorrect match.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;color : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Red&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;size : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;color : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Blue&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;size : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;M&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;lucene-index-representation&quot;&gt;Lucene Index Representation&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Lucene has a flat object model and does not really support “nesting” of documents in the index. Lucene *does* support adding a list of documents atomically and contiguously (i.e. a virtual “block”), and this is the feature used by Solr to implement “nested objects”.&lt;/p&gt;
&lt;p&gt;When you add a parent document with 3 children, these appear int the index contiguously as&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;child1, child2, child3, parent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;There is no Lucene-level information that links parent and child, or distinguishes this parent/child block from the other documents in the index that come before or after. Successfully using parent/child relationships relies on more information being provided at query time.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;limitations&quot;&gt;Limitations&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;All children of a parent document must be indexed together with the parent document. One cannot update any document (parent or child) individually. The entire block needs to be re-indexed of any changes need to be made.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;schema-requirements&quot;&gt;Schema Requirements&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;There are no schema requirements except that the _root_ field must exist (but that is there by default in all our schemas). Any document can have nested child documents.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;block-join&quot;&gt;Block Join&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;“Block Join” refers to the set of related query technologies to efficiently map from parents to children or vice versa at query time. The locality of children and parents can be used to both speed up query operations and lower memory requirements compared to other join methods.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;indexing-nested-documents&quot;&gt;Indexing Nested Documents&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;NOTE: This example currently requires &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Solr 5.3&lt;/a&gt; or later.&lt;/p&gt;
&lt;p&gt;First, bring up Solr and create a collection (if you have not done so already):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ bin/solr start            # this starts solr&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ bin/solr create -c demo   # this creates a document collection called &quot;demo&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Let’s remove any leftover docs from other examples:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/update?commitWithin=3000 -d &apos;{delete:{query:&quot;*:*&quot;}}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now let’s add a book with some reviews as nested child documents (notice the &lt;code dir=&quot;auto&quot;&gt;_childDocuments_&lt;/code&gt; element):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/update?commitWithin=3000 -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{id : &lt;/span&gt;&lt;span&gt;book1&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;book&lt;/span&gt;&lt;span&gt;, title_t : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The Way of Kings&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, author_s : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brandon Sanderson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cat_s:&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;, pubyear_i:&lt;/span&gt;&lt;span&gt;2010&lt;/span&gt;&lt;span&gt;&lt;span&gt;, publisher_s:&lt;/span&gt;&lt;span&gt;Tor&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;_childDocuments_ : [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ id: &lt;/span&gt;&lt;span&gt;book1_c1&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;, review_dt:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2015-01-03T14:30:00Z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stars_i:&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;&lt;span&gt;, author_s:&lt;/span&gt;&lt;span&gt;yonik&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;comment_t:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;A great start to what looks like an epic series!&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ id: &lt;/span&gt;&lt;span&gt;book1_c2&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;, review_dt:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2014-03-15T12:00:00Z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stars_i:&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;&lt;span&gt;, author_s:&lt;/span&gt;&lt;span&gt;dan&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;comment_t:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;This book was too long.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now we can see that these are really just indexed as 3 documents, all visible by default:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/query -d &apos;q=*:*&amp;#x26;fl=id&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;numFound&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1_c1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1_c2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now lets add an additional document with nested child documents for use with our query examples:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/update?commitWithin=3000 -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{id : &lt;/span&gt;&lt;span&gt;book2&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;book&lt;/span&gt;&lt;span&gt;, title_t : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Snow Crash&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, author_s : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Neal Stephenson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cat_s:&lt;/span&gt;&lt;span&gt;sci&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;span&gt;, pubyear_i:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1992&lt;/span&gt;&lt;span&gt;&lt;span&gt;, publisher_s:&lt;/span&gt;&lt;span&gt;Bantam&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;_childDocuments_ : [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ id: &lt;/span&gt;&lt;span&gt;book2_c1&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;, review_dt:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2015-01-03T14:30:00Z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stars_i:&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;&lt;span&gt;, author_s:&lt;/span&gt;&lt;span&gt;yonik&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;comment_t:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Ahead of its time... I wonder if it helped inspire The Matrix?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ id: &lt;/span&gt;&lt;span&gt;book2_c2&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;, review_dt:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2015-04-10T9:00:00Z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stars_i:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&lt;span&gt;, author_s:&lt;/span&gt;&lt;span&gt;dan&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;comment_t:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;A pizza boy for the Mafia franchise? Really?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ id: &lt;/span&gt;&lt;span&gt;book2_c3&lt;/span&gt;&lt;span&gt;, type_s:&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;, review_dt:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2015-06-02T00:00:00Z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stars_i:&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;&lt;span&gt;, author_s:&lt;/span&gt;&lt;span&gt;mary&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;comment_t:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Neal is so creative and detailed! Loved the metaverse!&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;block-join-query&quot;&gt;Block Join Query&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;TODO&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;returning-child-documents&quot;&gt;Returning Child Documents&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;One can return child documents along with every returned parent document by using the &lt;code dir=&quot;auto&quot;&gt;[child]&lt;/code&gt; doc transformer (it’s added to the &lt;code dir=&quot;auto&quot;&gt;fl&lt;/code&gt; field list parameter ). The list of child documents will be included under the “_childDocuments_” field of each parent.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;cat_s:(&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OR&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sci&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fl&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,[&lt;/span&gt;&lt;span&gt;child&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parentFilter&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;type_s&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;book&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;numFound&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;_childDocuments_&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1_c1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;review_dt&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2015-01-03T14:30:00Z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;stars_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;yonik&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;comment_t&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;A great start to what looks like an epic series!&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1_c2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;review&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Child Doc Transformer Parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;parentFilter&lt;/code&gt; - identifies &lt;strong&gt;all&lt;/strong&gt; of the parents. See the section on &lt;a href=&quot;#ParentFilter&quot;&gt;The Parent Filter&lt;/a&gt; for more info.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;childFilter&lt;/code&gt; - optional query to filter which child documents should be included.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;limit&lt;/code&gt; - maximum number of child documents to return per parent (defaults to 10)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also see the Solr ref guide entry on &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Transforming+Result+Documents#TransformingResultDocuments-%5Bchild%5D-ChildDocTransformerFactory&quot;&gt;the [child] doc transformer&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;faceting&quot;&gt;Faceting&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The JSON Facet API has support for switching the facet domain based on the nested document relationships.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;faceting-on-parents&quot;&gt;Faceting on Parents&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The main query gives us a document list of reviews by &lt;code dir=&quot;auto&quot;&gt;author_s:yonik&lt;/code&gt; If we want to facet on the book genre (cat_s field) then we need to switch the &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; from the children (type_s:reviews) to the parents (type_s:books).&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;author_s:&lt;/span&gt;&lt;span&gt;yonik&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;comment_t&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;genres : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field: &lt;/span&gt;&lt;span&gt;cat_s&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain: { blockParent : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type_s:book&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And we get a facet over the books which yonik reviewed:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;numFound&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1_c1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;comment_t&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;A great start to what looks like an epic series!&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book2_c1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;comment_t&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Ahead of its time... I wonder if it helped inspire The Matrix?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genres&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sci-fi&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;faceting-on-children&quot;&gt;Faceting on Children&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Now lets say we’re displaying the top sci-fi and fantasy books, and we want to find out who reviews the most books out of our selection. Since our root implicit facet bucket (formed by the query and filters) consists of parent documents (books), we need to switch the facet domain to the children for the author facet.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;cat_s:(&lt;/span&gt;&lt;span&gt;sci&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OR&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;title_t&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_reviewers : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field: &lt;/span&gt;&lt;span&gt;author_s&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain: { blockChildren : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type_s:book&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;numFound&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title_t&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The Way of Kings&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title_t&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Snow Crash&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;top_reviewers&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dan&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;yonik&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mary&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;filtering-children&quot;&gt;Filtering Children&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;By default, &lt;code dir=&quot;auto&quot;&gt;blockChildren&lt;/code&gt; will match &lt;strong&gt;all&lt;/strong&gt; children of every parent doc from the input domain. It’s often the case that only a subset of the children are desired. The easiest way to limit children is with the &lt;code dir=&quot;auto&quot;&gt;filter&lt;/code&gt; clause.&lt;/p&gt;
&lt;p&gt;For example, if we wanted to find the same top reviewers as before, but only for 5 star reviews:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/demo/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;cat_s:(&lt;/span&gt;&lt;span&gt;sci&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OR&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;title_t&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_reviewers : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field: &lt;/span&gt;&lt;span&gt;author_s&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blockChildren : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type_s:book&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;stars_i:5&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;the-parent-filter&quot;&gt;The Parent Filter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Note that regardless of which direction we are mapping (parents to children or children to parents), or what documents we are operating on, we provide a parent filter to define the &lt;strong&gt;complete&lt;/strong&gt; set of parents in the index. In these examples, the parent filter is &lt;code dir=&quot;auto&quot;&gt;&quot;type_s:book&quot;&lt;/code&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Solr JSON Request API</title><link>https://yonik.com/blog/solr-json-request-api/</link><guid isPermaLink="true">https://yonik.com/blog/solr-json-request-api/</guid><description>Solr JSON Request API, fully integrated with the JSON Facet Request API, for structured requests, good error reporting, smart merging of JSON queries</description><pubDate>Tue, 18 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h3 id=&quot;json-request-api-motivation&quot;&gt;JSON Request API Motivation&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Although query parameters are often an easy method to create a Solr requests by hand, they have a number of drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inherently un-structured, requiring unsightly parameters like &lt;code dir=&quot;auto&quot;&gt;f.facet_name.facet.range.start=5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Inherently un-typed… everything is a string.&lt;/li&gt;
&lt;li&gt;More difficult to decipher large requests.&lt;/li&gt;
&lt;li&gt;Harder to programmatically create a request.&lt;/li&gt;
&lt;li&gt;Impossible to validate. Because of the lack of structure, we don’t know the set of valid parameter and thus can’t do good error checking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solr already had a &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON API for faceting and analytics&lt;/a&gt;, and this new feature has extended that to the complete Solr request!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;simple-example&quot;&gt;Simple Example&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;First let’s add a few excellent books from the fantasy genre (the “commitWithin=1000” will cause them to be visible to searches within 1000 milliseconds):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/update?commitWithin=1000 -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brandon Sanderson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The Final Empire&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;series_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Mistborn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sequence_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genre_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brandon Sanderson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The Well of Ascension&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;series_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Mistborn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sequence_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genre_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brandon Sanderson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The Hero of Ages&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;series_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Mistborn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sequence_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genre_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now we can &lt;strong&gt;search them with a JSON request&lt;/strong&gt; rather than using query parameters:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hero&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;RESPONSE:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;responseHeader&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;QTime&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;n{n  query:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hero&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;n}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;}},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;numFound&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;book3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brandon Sanderson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brandon Sanderson&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The Hero of Aages&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;series_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Mistborn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sequence_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genre_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;_version_&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1486581355536973824&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A few things to note from our example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSON body is considered a parameter named “json” and echoed back with the other params (unless you disable it with &lt;code dir=&quot;auto&quot;&gt;echoParams=none&lt;/code&gt;). This will also cause it to be logged, which is normally important.&lt;/li&gt;
&lt;li&gt;The JSON we send to Solr can include unquoted simple strings and can contain comments. See &lt;a href=&quot;https://yonik.com/blog/json-facet-api/#JSON_Extensions&quot;&gt;JSON Extensions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We don’t need to pass the Content-Type for indexing or for querying when we’re using JSON since Solr is now smart enough to &lt;strong&gt;auto-detect&lt;/strong&gt; it when Curl is the client.&lt;/li&gt;
&lt;li&gt;HTTP GET requests are now allowed to have a request body (i.e. try using “curl -XGET” for the query)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s a &lt;strong&gt;more complete example&lt;/strong&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;XGET&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*:*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter : [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author:brandon&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genre_s:fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;offset : &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit : &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fields : [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;],  &lt;/span&gt;&lt;span&gt;// we could also use the string form &quot;title,author&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sort : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sequence_i desc&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet : {  &lt;/span&gt;&lt;span&gt;// the JSON Facet API is nicely integrated as well&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;avg_price : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_authors : {terms : &lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;passing-json-via-request-parameter&quot;&gt;Passing JSON via Request Parameter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;It may sometimes be more convenient to pass the JSON body as a request parameter rather than in the actual body of the HTTP request. Solr treats a &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; parameter the same as a JSON body.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;json={query:&quot;hero&quot;}&amp;#x26;fq=author:brandon&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;smart-merging-of-multiple-json-parameters&quot;&gt;Smart merging of multiple JSON parameters&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Multiple &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; parameters in a single request are merged before being interpreted.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single-valued elements are overwritten by the last value.&lt;/li&gt;
&lt;li&gt;Multi-valued elements like&lt;code dir=&quot;auto&quot;&gt;fields&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;filter&lt;/code&gt; are appended.&lt;/li&gt;
&lt;li&gt;Parameters of the form &lt;code dir=&quot;auto&quot;&gt;json.&amp;#x3C;path&gt;=&amp;#x3C;json_value&gt;&lt;/code&gt; are merged in the appropriate place in the hierarchy. For example a &lt;code dir=&quot;auto&quot;&gt;json.facet&lt;/code&gt; parameter is the same as “facet” within the JSON body.&lt;/li&gt;
&lt;li&gt;A JSON body, or straight &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; parameters are always parsed first, meaning that other request parameters come after, and overwrite single valued elements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Smart merging gives the &lt;strong&gt;best of both worlds&lt;/strong&gt;… the structure of JSON with the ability to selectively separate out / decompose parts of the request!&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;simple-example-1&quot;&gt;Simple Example&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;http://localhost:8983/solr/query?json.limit=5&amp;#x26;json.filter=&quot;genre_s:fantasy&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hero&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit : &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author:brandon&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;is equivalent to&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hero&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit : &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,   &lt;/span&gt;&lt;span&gt;// this parameter was overwritten&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter : [ &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author:brandon&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; , &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;genre_s:fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ]  &lt;/span&gt;&lt;span&gt;// this parameter was appended to&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;facet-example&quot;&gt;Facet Example&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;In fact, you don’t even need to start with a JSON body for smart merging to be very useful. Consider the following request composed entirely of request params:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;q=*:*&amp;#x26;rows=1&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;avg_price&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top_authors&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,field:&lt;/span&gt;&lt;span&gt;author_s&lt;/span&gt;&lt;span&gt;,limit:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;That is equivalent to having the following JSON body or &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; parameter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;avg_price: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_authors: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field: &lt;/span&gt;&lt;span&gt;author_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;debugging&quot;&gt;Debugging&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;What to see what your merged JSON looks like? Just ask for debugging information (i.e. use the &lt;code dir=&quot;auto&quot;&gt;debug=true&lt;/code&gt; param), and it will come back under the &lt;code dir=&quot;auto&quot;&gt;&quot;json&quot;&lt;/code&gt; key along with the other debugging information.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;passing-parameters-via-json&quot;&gt;Passing Parameters via JSON&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We can also pass normal request parameters in the JSON body within the &lt;code dir=&quot;auto&quot;&gt;params&lt;/code&gt; block:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://localhost:8983/solr/query?fl=title,author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title:hero&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rows:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Which is equivalent to:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://localhost:8983/solr/query?fl=title,author&amp;#x26;q=title:hero&amp;#x26;rows=1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;error-detection&quot;&gt;Error Detection&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Because we didn’t pollute the root body of the JSON request with the normal Solr request parameters (they are all contained in the &lt;code dir=&quot;auto&quot;&gt;params&lt;/code&gt; block), we now have the ability to validate requests and return an error for unknown JSON keys.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hero&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fulter : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author:brandon&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// oops, we misspelled &quot;filter&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And we get an error back containing the error string:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Unknown top-level key in JSON request : fulter&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;parameter-substitution--macro-expansion&quot;&gt;Parameter Substitution / Macro Expansion&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Of course request templating via &lt;a href=&quot;https://yonik.com/blog/solr-query-parameter-substitution/&quot;&gt;Parameter Substitution&lt;/a&gt; works fully with JSON request bodies or parameters as well.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://localhost:8983/solr/query?FIELD=text&amp;#x26;TERM=hero&amp;#x26;HOWMANY=10&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${FIELD}:${TERM}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit:&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;HOWMANY&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;current-status&quot;&gt;Current Status&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The JSON Request API is currently in it’s infancy - only a few query parameters are supported (although the JSON Facet API which is part of this is more mature). Other Solr features you may want access to (like highlighting) currently need to be controlled through the normal Solr request params (e.g. just ad &lt;code dir=&quot;auto&quot;&gt;hl=true&lt;/code&gt; to the normal request parameters, or in the &lt;code dir=&quot;auto&quot;&gt;params&lt;/code&gt; block of a JSON request.&lt;/p&gt;
&lt;p&gt;Have ideas on what will make the API better? Want to help out with development? We’d love to hear from you on the solr-user mailing list!&lt;/p&gt;
</content:encoded></item><item><title>Solr 6.2 Features</title><link>https://yonik.com/blog/solr-6-2/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6-2/</guid><pubDate>Thu, 15 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.2.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6.2&lt;/a&gt; to try these features out and give us feedback! You can also check out &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;boolean-comparison-function-queries&quot;&gt;Boolean Comparison Function Queries&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Function queries for comparisons of numeric arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;gt&lt;/code&gt; - greater than&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;gte&lt;/code&gt; - greater than or equal&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;lt&lt;/code&gt; - less than&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;lte&lt;/code&gt; - less than or equal&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;eq&lt;/code&gt; - equal to&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These functions return a boolean value for any given document, which is normally used in conjunction with the &lt;code dir=&quot;auto&quot;&gt;if&lt;/code&gt; function which returns the second argument if the first argument is true, or the third argument otherwise.&lt;/p&gt;
&lt;p&gt;Example: For a given document, if &lt;code dir=&quot;auto&quot;&gt;num_reviewers&lt;/code&gt; is less than 5, return the value of the &lt;code dir=&quot;auto&quot;&gt;editor_score&lt;/code&gt; field, otherwise return the &lt;code dir=&quot;auto&quot;&gt;user_score&lt;/code&gt; field.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if( lt(num_reviewers,5), editor_score, user_score)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;An easy way to experiment with function queries and see the results is to use the &lt;code dir=&quot;auto&quot;&gt;pseudo-field&lt;/code&gt; functionality to return specific function values along with stored fields.&lt;/p&gt;
&lt;p&gt;Example: &lt;a href=&quot;http://localhost:8983/solr/techproducts/query?q=%5C*:%5C*&amp;#x26;fl=id,popularity,**gt(popularity,3)&quot;&gt;http://localhost:8983/solr/techproducts/query?q=\*:\*&amp;#x26;fl=id,popularity,**gt(popularity,3)&lt;/a&gt;**&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;SP2514N&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;popularity&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gt(popularity,3)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;6H500F0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;popularity&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gt(popularity,3)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;F8V7067-APL-KIT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;popularity&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gt(popularity,3)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;feature-selection-and-logistic-regression&quot;&gt;Feature Selection and Logistic Regression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;features&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;train&lt;/code&gt; streaming expressions are &lt;strong&gt;machine learning&lt;/strong&gt; related operations used to implement a text classifier. The goal is to create a classifier (or model) based on a training set of documents that can be used to tell if a new document should be considered part of that set.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;features&lt;/code&gt; - streaming expression that selects important features (important terms) from a set of documents called the training set (specified by a query).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;train&lt;/code&gt; - trains a logistic regression model on a text field using the selected features and the training set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s an example of the streaming expression syntax taken from the JIRA:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;train&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;collection1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*:*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;features&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;collection1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*:*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;outcome&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;out_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;positiveLabel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;numTerms&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;outcome&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;out_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxIterations&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Streaming+Expressions#StreamingExpressions-features&quot;&gt;features streaming expression&lt;/a&gt; and the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Streaming+Expressions#StreamingExpressions-train&quot;&gt;train streaming expression&lt;/a&gt; in the reference guide.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;topic-streaming-expression-beta&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;topic&lt;/code&gt; streaming expression (Beta)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;topic&lt;/code&gt; streaming expression implements a publish/subscribe messaging capabilities, where clients can subscribe to queries and receive deliveries of new documents that match those topic queries. When the first call is made, an &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; is specified to uniquely identify the topic. A &lt;code dir=&quot;auto&quot;&gt;checkpointCollection&lt;/code&gt; is also specified, and this is where topic progress is stored to keep track of which documents have already been returned.&lt;/p&gt;
&lt;p&gt;Example syntax:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;topic&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;checkpointCollection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;collection1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;yonik_topic1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title:(lucene solr)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id, title, abstract, author&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A client can keep calling the same topic to receive new documents, or it can be wrapped in a &lt;code dir=&quot;auto&quot;&gt;daemon&lt;/code&gt; streaming expression to provide push functionality.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;scorenodes-graph-streaming-expression&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;scoreNodes&lt;/code&gt; graph streaming expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;scoreNodes&lt;/code&gt; streaming expression is used to add a relevancy score to a graph expression, similar to tf-idf for text. The &lt;code dir=&quot;auto&quot;&gt;tf&lt;/code&gt; factor is how many times a node appears in the graph traversal, and biases scores in favor of nodes that appear often. The &lt;code dir=&quot;auto&quot;&gt;idf&lt;/code&gt; factor biases scores in favor of nodes that are more rare in the index.&lt;/p&gt;
&lt;p&gt;There is a good example of using this in the ref guide: &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Graph+Traversal#GraphTraversal-CalculateMarketBasketCo-occurrence&quot;&gt;Calculating Market Basket Co-occurrence&lt;/a&gt;, for calculating product recommendations based on your current shopping basket and what other shopping baskets look like.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;collections-api-replacenode-and-deletenode-commands&quot;&gt;collections API: &lt;code dir=&quot;auto&quot;&gt;REPLACENODE&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;DELETENODE&lt;/code&gt; commands&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;New actions have been added to the collections API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;REPLACENODE&lt;/code&gt; - moves all replicas from one node to another.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;DELETENODE&lt;/code&gt; - deletes all replicas currently on a given node.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples: /admin/collections?action=RELACENODE&amp;#x26;source=MY_OLD_NODE&amp;#x26;target=MY_NEW_NODE /admin/collections?action=DELETENODE&amp;#x26;node=MY_NODE_NAME&lt;/p&gt;
&lt;p&gt;See the relevant sections in the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Collections+API&quot;&gt;Collections API&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;kerberos-security-enhancements&quot;&gt;Kerberos security enhancements&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Kerberos delegation token support was added to the authentication filter, especially useful for when distributed clients such as MapReduce do not have access to the user’s credentials.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Kerberos+Authentication+Plugin&quot;&gt;Kerberos Authentication Plugin&lt;/a&gt; in the ref guide.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;whole-index-replication-for-cdcr-cross-data-center-replication&quot;&gt;Whole index replication for CDCR (Cross Data Center Replication)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;CDCR can now fall back to whole-index replication to bring a replica up to date when transaction logs have not retained enough updates to do so.  &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;role-tag-in-replica-placement-rules&quot;&gt;“role” tag in replica placement rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;SolrCloud nodes in the cluster have tags that may be used when performing rule based replica placement. A “role” tag has been added that currently be used to prevent placement of new replicas on the overseer node by adding &lt;code dir=&quot;auto&quot;&gt;rule=role:!overseer&lt;/code&gt; during collection creation.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Rule-based+Replica+Placement&quot;&gt;Rule Based Replica Placement&lt;/a&gt; in the ref guide for more info.&lt;/p&gt;
</content:encoded></item><item><title>Solr 6.3 Features</title><link>https://yonik.com/blog/solr-6-3/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6-3/</guid><pubDate>Tue, 23 Aug 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.3. &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6.3&lt;/a&gt; to try these features out and give us feedback! You can also check out &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;new-dvhash-faceting-method-in-the-json-facet-api&quot;&gt;New &lt;code dir=&quot;auto&quot;&gt;dvhash&lt;/code&gt; faceting method in the JSON Facet API&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A new faceting method for the &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt; has been added that utilizes hashing instead of direct indexing by ordinal. Currently, when hashing on a field with docValues enabled, or when specifying &lt;code dir=&quot;auto&quot;&gt;method=dv&lt;/code&gt;, there are accumulator arrays that are indexed by ordinal. When the cardinality of the domain is low, and the cardinality of the field is high, direct indexing of large arrays both wastes memory and takes longer to scan looking for the highest accumulated entries.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_authors : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit : &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;method : &lt;/span&gt;&lt;span&gt;dvhash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Since it may be difficult for a client to know when the facet domain will be large vs the field cardinality (esp if the domain is based off of a user query), future work is expected to implement automatically switching between faceting methods.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;optimizing-storing-and-deploying-ai-models-with-streaming-expressions&quot;&gt;Optimizing, storing and deploying AI models with Streaming Expressions&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;classify&lt;/code&gt; streaming expression classifies documents according to a model.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;classify(&amp;#x3C;document_stream&gt;,            // the stream to fetch documents that need to be classified&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;model_stream&gt;,               // the stream to fetch the latest model&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field=&amp;#x3C;input_text_field&gt;,     // the field on the document to classify&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fieldType=&amp;#x3C;analysis_fieldType&gt; // (opt) fieldType to use for tokenization of the input field&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For each input document, the classifier decorates the document with two (currently hardcoded) fields with the result:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;score_d&lt;/code&gt; - the raw score&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;probability_d&lt;/code&gt; - the positive probability that the document belongs to the group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;update&lt;/code&gt; streaming expression can be used to store classifier models in a SolrCloud collection, and the &lt;code dir=&quot;auto&quot;&gt;topic&lt;/code&gt; streaming expression can be used with the &lt;code dir=&quot;auto&quot;&gt;classify&lt;/code&gt; expression to both deploy models as well as stream new data through the models.&lt;/p&gt;
&lt;p&gt;The development JIRA &lt;a href=&quot;https://issues.apache.org/jira/browse/SOLR-9258&quot;&gt;SOLR-9258&lt;/a&gt; has examples, and should be consulted until the Solr reference guide is updated.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;executor-streaming-expression&quot;&gt;“executor” Streaming Expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;executor&lt;/code&gt; streaming expression wraps another stream containing streaming expressions. By default the expression will be contained in the &lt;code dir=&quot;auto&quot;&gt;expr_s&lt;/code&gt; field in each tuple of the wrapped stream. The executor has an internal thread pool so expressions can be executed in parallel on a single worker. This expression can further be wrapped in a &lt;code dir=&quot;auto&quot;&gt;parallel&lt;/code&gt; streaming expression to enable execution across a cluster of worker nodes.&lt;/p&gt;
&lt;p&gt;Example syntax from the JIRA of a work queue… the “topic” expression retrieves expressions to execute (and keeps track of where it left off):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;daemon&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;threads&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;topic&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;storedExpressions&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;expr_s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;commit-streaming-expression&quot;&gt;“commit” Streaming Expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;commit&lt;/code&gt; streaming expression wraps another stream (normally involving updates) and performs a commit at the end.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;targetCollection&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;targetCollection&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sourceCollection&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;myquery&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;fetch-streaming-expression&quot;&gt;“fetch” Streaming Expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; streaming expression wraps another expression and fetches additional fields from documents in batches. It’s very much like an inner join, with one side of the join being very small.&lt;/p&gt;
&lt;p&gt;Example that queries books and adds publisher address to each result:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;publisherCollection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;booksCollection&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*:*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title,author,publisher&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;publisher asc&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fl&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;publisherAddress&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;publisher=publisherId&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;lots-more&quot;&gt;Lots More…&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://wiki.apache.org/solr/ReleaseNote63&quot;&gt;release notes on the Solr wiki&lt;/a&gt; and the &lt;a href=&quot;https://github.com/apache/lucene-solr/blob/branch_6_3/solr/CHANGES.txt&quot;&gt;CHANGES file&lt;/a&gt; for an in-depth list of changes.&lt;/p&gt;
</content:encoded></item><item><title>Solr 6.1 Features</title><link>https://yonik.com/blog/solr-6-1/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6-1/</guid><pubDate>Sat, 09 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.1.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6.1&lt;/a&gt; to try these features out and give us feedback! You can also check out &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;shortestpath-streaming-expression&quot;&gt;shortestPath Streaming Expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A shortestPath Streaming Expression was added that implements a distributed breadth-first graph traversal to find the shortest paths in a directed directed graph.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;shortestPath(collection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from=&quot;john@company.com&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;to=&quot;jane@company.com&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;edge=&quot;from=to&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;threads=&quot;6&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;partitionSize=&quot;300&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fq=&quot;limiting query&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxDepth=&quot;4&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;gathernodes-streaming-expression-coming-soon&quot;&gt;gatherNodes Streaming Expression (coming soon)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The gatherNodes expression is a more general form of graph traversal than shortestPath, and can be used for more use cases.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gatherNodes(friends,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gatherNodes(friends,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search(articles, q=“body:(queryA)”, fl=“author”),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;walk =&quot;author-&gt;user”,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gather=&quot;friend&quot;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;walk=“friend-&gt;user”,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gather=&quot;friend&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;scatter=“roots, branches, leaves”)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;tolerantupdateprocessorfactory&quot;&gt;TolerantUpdateProcessorFactory&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;ToleranteUpdateProcessorFactory will skip update commands that would otherwise cause subsequent updates in a batch to fail.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;updateRequestProcessorChain name=&quot;tolerant&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;processor class=&quot;solr.TolerantUpdateProcessorFactory&quot;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;processor class=&quot;solr.DistributedUpdateProcessorFactory&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;processor class=&quot;solr.RunUpdateProcessorFactory&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;/updateRequestProcessorChain&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Passing &lt;code dir=&quot;auto&quot;&gt;update.chain=tolerant&lt;/code&gt; will use the processor chain defined above. One can also pass &lt;code dir=&quot;auto&quot;&gt;maxErrors=10&lt;/code&gt; to limit the number of errors before aborting the complete update request. For example, if one is loading a large CSV file with millions of entries for the first time, it may be useful to abort early if every addition would fail due to a configuration error.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;small-filter-optimization&quot;&gt;Small filter optimization&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Filter creation for small cardinality sets (those that match few documents) now produces much less garbage. Up to 3x performance producing small sets (due to less GC overhead).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;hdfs-optimizations&quot;&gt;HDFS optimizations&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The HDFS block cache now skips caching “read once” scenarios such as index merges.&lt;/p&gt;
</content:encoded></item><item><title>Solr 7 Features</title><link>https://yonik.com/blog/solr-7/</link><guid isPermaLink="true">https://yonik.com/blog/solr-7/</guid><pubDate>Sat, 09 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 7.0 &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 7&lt;/a&gt; to try these features out and give us feedback!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;point-numeric-fields&quot;&gt;Point Numeric Fields&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The now deprecated trie-based numeric fields use (and abuse) the full-text index to index parts of numbers to speed up range queries. The new Points-based numeric fields do not use the full-text index, but instead have a dedicated index structure designed specifically for multidimensional ranges over numbers: the BKD tree. The BKD tree index structure is smaller and faster for range queries, but is slightly slower for exact match queries.&lt;/p&gt;
&lt;p&gt;Since Point fields do not currently support un-inversion (i.e. FieldCache), some search functionality requires that points have docValues enabled for fast per-document lookups. This includes sorting, function queries, &lt;code dir=&quot;auto&quot;&gt;{!graph}&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;{!join}&lt;/code&gt; queries.&lt;/p&gt;
&lt;p&gt;  Current template schemas define types like the following:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;fieldType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pint&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;solr.IntPointField&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docValues&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;fieldType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pints&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;solr.IntPointField&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docValues&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;multiValued&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Along with corresponding dynamic field types:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dynamicField&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*_i&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pint&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;indexed&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;stored&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;dynamicField&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*_is&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pints&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;indexed&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;stored&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;  Interested in how the underlying BKD data structure works? Here’s a great lesson from Robert Sedgewick, Princeton University on KD trees (BKD trees are just a variant of KD trees):&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/qLnMoPPMX9Q?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;distributed-facet-refinement&quot;&gt;Distributed Facet Refinement&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt; has a new parameter called &lt;code dir=&quot;auto&quot;&gt;refine&lt;/code&gt; that turns on &lt;strong&gt;two-phase refinement&lt;/strong&gt; of partial facets during distributed faceting. This guarantees that the statistics (counts or other metrics) within returned facet buckets are accurate.&lt;/p&gt;
&lt;p&gt;Partial facets are those facets that specify a &lt;code dir=&quot;auto&quot;&gt;limit&lt;/code&gt; and thus may not return all facet buckets from all shards in a distributed search. If &lt;code dir=&quot;auto&quot;&gt;refine&lt;/code&gt; is set to &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt; on one of these partial facets, a second phase is used to “refine” the top buckets from the first phase, collecting information from other shards that did not yet contribute to those buckets. Without refinement, counts and statistics for the bucket can be incorrect. The second phase of faceting normally does not cause any additional HTTP requests since they are piggy-backed onto the normal second phase of distributed search that retrieves stored fields for the top document ids.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit : &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;refine : &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;minmax-aggregations-support-strings&quot;&gt;min/max Aggregations support Strings&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The min/max &lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;facet aggregations&lt;/a&gt; (facet functions) have been extended beyond numeric fields and functions to include single-valued string fields.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;new-streaming-evaluators&quot;&gt;New Streaming Evaluators&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Streaming Expressions has many new functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;movingAvg&lt;/li&gt;
&lt;li&gt;arraySort&lt;/li&gt;
&lt;li&gt;cumulative&lt;/li&gt;
&lt;li&gt;anova&lt;/li&gt;
&lt;li&gt;hist&lt;/li&gt;
&lt;li&gt;array&lt;/li&gt;
&lt;li&gt;sequence&lt;/li&gt;
&lt;li&gt;finddelay&lt;/li&gt;
&lt;li&gt;knn&lt;/li&gt;
&lt;li&gt;describe&lt;/li&gt;
&lt;li&gt;copyOfRange&lt;/li&gt;
&lt;li&gt;sql&lt;/li&gt;
&lt;li&gt;copyOf&lt;/li&gt;
&lt;li&gt;distance&lt;/li&gt;
&lt;li&gt;scale&lt;/li&gt;
&lt;li&gt;rank&lt;/li&gt;
&lt;li&gt;length&lt;/li&gt;
&lt;li&gt;reverse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;replica-types&quot;&gt;Replica Types&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;SolrCloud now has support for different replica types.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;nrt&quot;&gt;NRT&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;NRT stands for Near Real Time. This is the default and original replica type in SolrCloud. Updates flow from the leader to all replicas and are added to replica transaction logs as well as indexed. This is the only type of replica to support soft commits since TLOG and PULL replicas need hard commits to copy over new index segments.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;tlog&quot;&gt;TLOG&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Updates flow from the leader to all replicas and are added to replica transaction logs (tlogs) only. Replicas are kept up-to-date by pulling new index segment files from the leader. The transaction logs allow these replicas to recover and become a leader if necessary, as well as directly service real-time get requests.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;pull&quot;&gt;PULL&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Updates do not flow from the leader to replicas. Replicas are kept up-to-date by pulling new index segment files from the leader. This is similar to the original non-SolrCloud master-slave replication. Replicas of this type may not become leaders since updates would most likely be lost. Real-time get requests to a PULL replica are forwarded to the leader since these replicas lack transaction logs to find the most recent uncommitted updates.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;other-changes&quot;&gt;Other Changes&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The default response format has been changed from XML to indented JSON. Add &lt;code dir=&quot;auto&quot;&gt;wt=xml&lt;/code&gt; to the request obtain an XML response, and add &lt;code dir=&quot;auto&quot;&gt;indent=off&lt;/code&gt; if you wish to turn off indenting.&lt;/li&gt;
&lt;li&gt;The new v2 API, exposed at /api/ is now the preferred API (esp for using the collections API), but /solr/ continues to be supported.&lt;/li&gt;
&lt;li&gt;The alternate “Analytics Component” in the contrib modules was bumped to v2, with distributed support and a new JSON-based request syntax&lt;/li&gt;
&lt;li&gt;Auto-scaling framework that allows Solr to place new replicas based on metrics such as free disk space.&lt;/li&gt;
&lt;li&gt;The standard lucene/solr query parser now defaults to &lt;code dir=&quot;auto&quot;&gt;sow=false&lt;/code&gt;, meaning that for text fields, it does not split on whitespace before handing the text to the analyzer. This enabled multi-word synonyms to be matched by the analyzer.&lt;/li&gt;
&lt;li&gt;When a collection is created without specifying a configset, the new ‘_default’ configset is now used. It is data-driven (schemaless), and indexes strings as analyzed text in addition to using a copyField to &lt;code dir=&quot;auto&quot;&gt;*_str&lt;/code&gt; field suitable for sorting or faceting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href=&quot;http://lucene.apache.org/solr/7_0_0/changes/Changes.html#v7.0.0.upgrading_from_solr_6.x&quot;&gt;CHANGES&lt;/a&gt; for more detailed upgrade notes. Also see the official &lt;a href=&quot;https://wiki.apache.org/solr/ReleaseNote70&quot;&gt;release notes&lt;/a&gt; on the Solr wiki. The &lt;a href=&quot;http://lucene.apache.org/solr/guide/&quot;&gt;Solr Reference Guide&lt;/a&gt; should contain other upgrade info.&lt;/p&gt;
</content:encoded></item><item><title>Solr 6 Features</title><link>https://yonik.com/blog/solr-6/</link><guid isPermaLink="true">https://yonik.com/blog/solr-6/</guid><description>Features in the next new major release of Lucene/Solr 6</description><pubDate>Tue, 05 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 6.0.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download Solr 6&lt;/a&gt; to try these features out and give us feedback! You can also check out &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;parallel-sql&quot;&gt;Parallel SQL&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Parallel SQL queries across SolrCloud collections. The SQL engine is built on top of Solr’s Streaming API (Streaming Expressions), which provides support for parallel relational algebra and real-time map-reduce.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL statements are compiled to Streaming Expressions for parallel execution across SolrCloud worker nodes.&lt;/li&gt;
&lt;li&gt;SolrCloud collections are abstracted as Relational Tables.&lt;/li&gt;
&lt;li&gt;Full support for Lucene/Solr query syntax in the WHERE clause.&lt;/li&gt;
&lt;li&gt;Many operations such as grouping/rollups can be automatically parallelized, utilizing the real-time MapReduce capabilities of the streaming expressions.&lt;/li&gt;
&lt;li&gt;Grouping/rollup operations can be pushed down and leverage the JSON Facet API for increased performance.&lt;/li&gt;
&lt;li&gt;Currently works in SolrCloud mode only… no standalone mode yet.&lt;/li&gt;
&lt;li&gt;SQL functionality is currently experimental and incomplete (for example underlying streaming join functionality is still in the process of being integrated.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;select category, count(*), sum(inventory), min(price), max(price), avg(outstanding) from collection1 where text=&apos;4k HDTV&apos; group by category order by sum(inventory) asc limit 10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;select id,category from collection1 where category = &apos;(dvd OR bluray)&apos; order by category desc limit 100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;select fieldA, fieldB, count(*), sum(fieldC), avg(fieldY)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from collection1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;where fieldC = &apos;term1 term2&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;group by fieldA, fieldB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;having sum(fieldC) &gt; 1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;order by sum(fieldC) asc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;limit 100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Parallel+SQL+Interface&quot;&gt;Parallel SQL&lt;/a&gt; documentation for more info.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;sql&quot;&gt;/sql&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;There is a SQL Request Handler mapped to the &lt;code dir=&quot;auto&quot;&gt;/sql&lt;/code&gt; endpoint. Only SolrCloud collections can currently be searched with the SQL handler.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ curl http://localhost:8983/solr/techproducts/sql -d &quot;stmt=select id from techproducts&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;result-set&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;EN7800GTX/2DHTV/256M&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;100-435805&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UTF8TEST&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;SOLR1000&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;9885A004&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;jdbc-driver&quot;&gt;JDBC driver&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Solr has a new JDBC driver that may be used to access the new SQL functionality. The Solr JDBC driver has been tested with DbVisualizer, Apache Zeppelin, and SQuirreL SQL so far.&lt;/p&gt;
&lt;p&gt;The general form of the JDBC connection string is:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;jdbc:solr://SOLR_ZK_CONNECTION_STRING?collection=COLLECTION_NAME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The JDBC driver is not yet documented in the Ref Guide, so see &lt;a href=&quot;https://issues.apache.org/jira/browse/SOLR-8521&quot;&gt;https://issues.apache.org/jira/browse/SOLR-8521&lt;/a&gt; for more documentation in the meantime.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;streaming-expressions&quot;&gt;Streaming Expressions&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;distributed-joins&quot;&gt;Distributed Joins&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A number of distributed join operations have been added to streaming expressions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;innerJoin&lt;/li&gt;
&lt;li&gt;leftOuterJoin&lt;/li&gt;
&lt;li&gt;hashJoin&lt;/li&gt;
&lt;li&gt;outerHashJoin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;innerJoin(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search(collection1, q=*:*, fl=&quot;fieldA, fieldB, fieldC&quot;, ...),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search(collection2, q=*:*, fl=&quot;fieldA, fieldD, fieldE&quot;, ...),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;on=&quot;fieldA=fieldA&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;rollup-streaming-expression&quot;&gt;rollup Streaming Expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The rollup streaming expression groups tuples by common field values and emits the rollup value along with other specified metrics.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rollup(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search(collection1, qt=&quot;/export&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q=&quot;*:*&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fl=&quot;id,manu,price&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sort=&quot;manu asc&quot;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;over=&quot;manu&quot;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count(*),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;max(price)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;facet-streaming-expression&quot;&gt;facet Streaming Expression&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;facet&lt;/code&gt; streaming expression is much like the rollup expression, but it pushes down the computation to the leaves using the &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;facet(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;techproducts,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q=&quot;*:*&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;buckets=&quot;manu&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bucketSorts=&quot;count(*) desc&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bucketSizeLimit=1000,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count(*),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sum(price),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;max(popularity)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;streaming-expression-docs&quot;&gt;Streaming Expression Docs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Many other Streaming Expressions were added for the Solr 6 release. At this point, they should all be documented in the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Streaming+Expressions&quot;&gt;Streaming Expressions section of the Solr Ref Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;graph-traversal-query&quot;&gt;Graph traversal query&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A basic graph traversal query that follows nodes to edges, optionally filtering during traversal.&lt;/p&gt;
&lt;p&gt;Example: Assume we have documents that represent people, and each document has a field called “parent_id” which lists the parents. This example query matches “Philip J. Fry” and all of his ancestors:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fq={!graph from=parent_id to=id}id:&quot;Philip J. Fry&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The main argument to the graph query defines the root set, in this case &lt;code dir=&quot;auto&quot;&gt;id:&quot;Philip J. Fry&quot;&lt;/code&gt;. The graph query then iteratively follows the &lt;code dir=&quot;auto&quot;&gt;parent_id&lt;/code&gt; field to documents with corresponding &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; fields (i.e. for each iteration, the values for &lt;code dir=&quot;auto&quot;&gt;parent_id&lt;/code&gt; in the current set are matched to &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; field of all documents). The basic graph query is equivalent to a repeated join query.&lt;/p&gt;
&lt;p&gt;Graph query parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;from&lt;/code&gt;
- The field used in the current set of documents to match to the &lt;code dir=&quot;auto&quot;&gt;to&lt;/code&gt; field in the set of destination documents.- &lt;code dir=&quot;auto&quot;&gt;to&lt;/code&gt;
- The field used to find matches in the values obtained from the &lt;code dir=&quot;auto&quot;&gt;from&lt;/code&gt; fields of the starting set of documents.- &lt;code dir=&quot;auto&quot;&gt;traversalFilter&lt;/code&gt; - A filter query that is applied on each iteration.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;returnRoot&lt;/code&gt; - Controls whether the root set of documents should be included. Defaults to “true”.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;returnOnlyLeaf&lt;/code&gt; - If true, only returns leaf documents. Defaults to “false”.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;maxDepth&lt;/code&gt; - The maximum number of iterations before graph traversal stops. Defaults to -1 (unlimited).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NOTE: This graph query only traverses edges in the same index (i.e. it does not traverse edges across different nodes/cores). Distributed graph traversal is being developed and will be in future versions of Solr 6.x&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;bm25-scoring&quot;&gt;BM25 scoring&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Default scoring now uses &lt;a href=&quot;https://en.wikipedia.org/wiki/Okapi_BM25&quot;&gt;Okapi BM25&lt;/a&gt; by default. You can enable the old tf-idf vector space similarity by using &lt;code dir=&quot;auto&quot;&gt;ClassicSimilarity&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is an example of how to use classic tf-idf similarity just for the “text” fieldType in the Solr schema:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;fieldType name=&quot;text&quot; class=&quot;solr.TextField&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;analyzer class=&quot;org.apache.lucene.analysis.standard.StandardAnalyzer&quot;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;similarity class=&quot;solr.ClassicSimilarityFactory&quot;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;/fieldType&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For BM25, one can tweak the scoring function on a per-fieldType basis. For example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;fieldType name=&quot;text2&quot; class=&quot;solr.TextField&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;analyzer class=&quot;org.apache.lucene.analysis.standard.StandardAnalyzer&quot;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;similarity class=&quot;solr.BM25SimilarityFactory&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;float name=&quot;k1&quot;&gt;1.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;float name=&quot;b&quot;&gt;0.75&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;/similarity&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;/fieldType&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For those new to full-text search terminology, “similarity” produces a score for how similar a document is to a full-text query. When determining this score, document statistics as well as corpus statistics are used. Some scoring factors include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The number of times a search term appears in the document field. More matches produces a higher score.&lt;/li&gt;
&lt;li&gt;The size of the document field. Longer fields produce a lower score, with the idea being that for a given number of term matches, shorter is better (more specific match)&lt;/li&gt;
&lt;li&gt;The average length of the field across the entire corpus (BM25 considers this, classic tf-idf does not)&lt;/li&gt;
&lt;li&gt;How common the query terms are across the entire corpus. The idea being that rarer terms carry more information. For example, if I searched for “blue whale”, all else being equal, I’d probably want things about whales to score higher than things about blue.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;filters-for-real-time-get&quot;&gt;Filters for Real-Time Get&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Real-Time Get (normally handled at the /get URL) now handles filters (&lt;code dir=&quot;auto&quot;&gt;fl&lt;/code&gt; parameters) to restrict matching documents.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl &quot;http://localhost:8983/solr/demo/get?id=book1,book2,book3&amp;#x26;fl=security:group1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;cross-data-center-replication&quot;&gt;Cross Data Center Replication&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;An experimental version of CDCR (Cross Data Center Replication) has been added that supports an active-passive configuration.&lt;/p&gt;
&lt;p&gt;Updates are asynchronously sent from the active cluster leader to the passive cluster leader. Since updates are asynchronously relayed from the leader’s transaction logs, temporary connectivity issues between data centers can be tolerated with no interruption in service for the primary DC.&lt;/p&gt;
&lt;p&gt;Here is the &lt;a href=&quot;https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=62687462&quot;&gt;in-progress CDCR documentation&lt;/a&gt;. The documentation link is likely to change once CDCR moves out of it’s “experimental” phase.&lt;/p&gt;
</content:encoded></item><item><title>Solr 5.5 Features</title><link>https://yonik.com/blog/solr-5-5/</link><guid isPermaLink="true">https://yonik.com/blog/solr-5-5/</guid><description>Here&apos;s an overview of some of the new features in Apache Solr 5.5</description><pubDate>Thu, 10 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 5.5 Also see &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Solr Download Links&lt;/a&gt; and &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming Features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;return-docvalues-fields-like-stored-fields&quot;&gt;Return docValues fields like stored fields&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In previous Solr versions, returning the top N documents only retrieved field values from the row-store (i.e. fields where “stored” is true). Values will now also be retrieved from &lt;code dir=&quot;auto&quot;&gt;docValues&lt;/code&gt; (which are essentially &lt;strong&gt;column stored&lt;/strong&gt;) for fields where “stored” is false. This avoids the need to duplicate the value in the row store if it’s already column stored.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;facet-debug-info&quot;&gt;facet debug info&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;&quot;facet-trace&quot;&lt;/code&gt; section has been added to the debug info for &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facets&lt;/a&gt;. The exact format is subject to change, but the current information includes information about each facet command, including the processor used to execute the facet and the domain size. This information is included recursively included for each facet bucket for facets with &lt;a href=&quot;https://yonik.com/blog/solr-subfacets/&quot;&gt;sub-facets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Example request:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ curl http://localhost:8983/solr/techproducts/query -d &apos;q=*:*&amp;#x26;rows=0&amp;#x26;debug=true&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;json.facet={&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : terms,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : cat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Example response debug info:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;facet-trace&quot;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;processor&quot;:&quot;FacetQueryProcessor&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;elapse&quot;:0,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;query&quot;:null,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;domainSize&quot;:32,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;sub-facet&quot;:[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;processor&quot;:&quot;FacetFieldProcessorUIF&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;elapse&quot;:0,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;field&quot;:&quot;cat&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;limit&quot;:10,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;numBuckets&quot;:16,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;domainSize&quot;:32}]},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;uninvertedfield-faceting-method-restored&quot;&gt;UnInvertedField faceting method restored&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;facet.method=uif&lt;/code&gt; parameter causes traditional field faceting to delegate to the &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt; with &lt;code dir=&quot;auto&quot;&gt;method=uif&lt;/code&gt;. This is roughly equivalent to what the Solr 4 default faceting method was for multi-valued fields. It is optimized for performance over static indexes rather than NRT (quickly changing indexes).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;stored-field-compression-mode&quot;&gt;Stored field compression mode&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The compression mode for stored fields can now be specified via codecFactory in solrconfig.xml See the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Codec+Factory&quot;&gt;Codec Factory&lt;/a&gt; section in the Solr reference guide for more details.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;async-collection-apis&quot;&gt;Async Collection APIs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Generic support was added for making collection APIs async. Async support was added for the following commands: delete/reload collection, create/delete alias, create/delete shard, delete replica, add/delete replica property, add/remove role, overseer status, balance shard unique, rebalance leaders, modify collection, migrate state format.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-AsynchronousCalls&quot;&gt;Asynchronous Calls&lt;/a&gt; in the Solr ref guide.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;blockjoinfacetcomponent&quot;&gt;BlockJoinFacetComponent&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;There is a new experimental BlockJoinFacetComponent for calculating facets by a &lt;code dir=&quot;auto&quot;&gt;child.facet.field&lt;/code&gt; parameter with a &lt;code dir=&quot;auto&quot;&gt;{!parent}&lt;/code&gt; query. The component is not enabled by default. Note that this component is unrelated to the &lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/#faceting&quot;&gt;block join faceting&lt;/a&gt; support in the JSON Facet API.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;xml-query-syntax&quot;&gt;XML Query Syntax&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The XML query parser, registered as “xmlparser” is a direct interface to Lucene’s XMLQueryParser (CoreParser). Personal recommendation: avoid the use of this query parser unless you have very unusual/specific needs.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl http://localhost:8983/solr/techproducts/query -d &apos;debugQuery=true&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q={!xmlparser}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;BooleanQuery&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;Clause occurs=&quot;must&quot;&gt; &amp;#x3C;TermQuery fieldName=&quot;name&quot;&gt;ipod&amp;#x3C;/TermQuery&gt; &amp;#x3C;/Clause&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x3C;Clause occurs=&quot;must&quot;&gt; &amp;#x3C;TermQuery fieldName=&quot;manu&quot;&gt;apple&amp;#x3C;/TermQuery&gt; &amp;#x3C;/Clause&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/BooleanQuery&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This parser does not do any text analysis on terms, so provided terms will need to match what is in the index exactly (i.e. you will need to do things like lowercasing and stemming yourself). Good backward compatibility is unlikely with this parser as it exposes more internal implementation details. Term queries on fields such as numeric fields, enum fields, and boolean fields will only work if you know the internal term representation in the index.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-XMLQueryParser&quot;&gt;XmlQParser&lt;/a&gt; in the Solr ref guide for more info.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;upconfig-and-downconfig&quot;&gt;upconfig and downconfig&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;configset&lt;/code&gt;, or configuration set, is a set of config files for a Solr collection. For SolrCloud mode, an &lt;code dir=&quot;auto&quot;&gt;upconfig&lt;/code&gt; option has been added to the &lt;code dir=&quot;auto&quot;&gt;/bin/solr&lt;/code&gt; script to upload a configset to zookeeper. A matching &lt;code dir=&quot;auto&quot;&gt;downconfig&lt;/code&gt; option has been added to download a configset from zookeeper.&lt;/p&gt;
&lt;p&gt;For examples and documentation, see &lt;a href=&quot;https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=50234737#SolrStartScriptReference-ZooKeeperOperations&quot;&gt;bin/solr Zookeeper Operations&lt;/a&gt; in the Solr reference guide.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;checkindex-for-hdfs&quot;&gt;CheckIndex for HDFS&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;There is an internal CheckHdfsIndex class that can be run from the command line for HDFS indexes like CheckIndex can be run for normal indexes. Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;java -cp &quot;./server/solr-webapp/webapp/WEB-INF/lib/*:./server/lib/ext/*&quot; -ea:org.apache.lucene... org.apache.solr.index.hdfs.CheckHdfsIndex /path/to/my/index/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;  For reference, here is also the command to run CheckIndex on a local (non-HDFS) lucene index:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;java -cp &quot;./server/solr-webapp/webapp/WEB-INF/lib/*:./server/lib/ext/*&quot; -ea:org.apache.lucene... org.apache.lucene.index.CheckIndex ./example/techproducts/solr/techproducts/data/index&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Which will result in the following output:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Opening index @ ./example/techproducts/solr/techproducts/data/index&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Segments file=segments_2 numSegments=1 version=6.0.0 id=bv1fdquc5dh3nvcf4jxiwfow4 format= userData={commitTimeMSec=1456073865693}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1 of 1: name=_0 maxDoc=32&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version=6.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id=bv1fdquc5dh3nvcf4jxiwfow3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;codec=Lucene60&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compound=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;numFiles=13&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;size (MB)=0.026&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;diagnostics = {java.runtime.version=1.8.0_40-b25, java.vendor=Oracle Corporation, java.version=1.8.0_40, java.vm.version=25.40-b25, lucene.version=6.0.0, os=Mac OS X, os.arch=x86_64, os.version=10.11.2, source=flush, timestamp=1456073865745}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;no deletions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: open reader.........OK [took 0.059 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: check integrity.....OK [took 0.000 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: check live docs.....OK [took 0.000 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: field infos.........OK [25 fields] [took 0.000 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: field norms.........OK [5 fields] [took 0.001 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: terms, freq, prox...OK [1187 terms; 1813 terms/docs pairs; 1496 tokens] [took 0.025 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: stored fields.......OK [356 total field count; avg 11.1 fields per doc] [took 0.013 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: term vectors........OK [3 total term vector count; avg 1.0 term/freq vector fields per doc] [took 0.006 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: docvalues...........OK [0 docvalues fields; 0 BINARY; 0 NUMERIC; 0 SORTED; 0 SORTED_NUMERIC; 0 SORTED_SET] [took 0.000 sec]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;No problems were detected with this index.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Took 0.246 sec total.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
</content:encoded></item><item><title>Multi-Select Faceting</title><link>https://yonik.com/blog/multi-select-faceting/</link><guid isPermaLink="true">https://yonik.com/blog/multi-select-faceting/</guid><description>Solr multi-select faceting example that uses filter tagging and filter exclusions via excludeTags to allow users to select multiple facets per category</description><pubDate>Wed, 25 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;NOTE: This uses syntax from the upcoming Solr 5.4 release. If you are using Solr 5.2 or 5.3, specify &lt;code dir=&quot;auto&quot;&gt;domain:{excludeTags:mytag}&lt;/code&gt; as &lt;code dir=&quot;auto&quot;&gt;excludeTags:mytag&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;multi-select-faceting-with-solr&quot;&gt;Multi-Select Faceting with Solr&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Multi-select faceting&lt;/strong&gt; is a powerful faceting style that allows users to see and &lt;strong&gt;select multiple facet constraints&lt;/strong&gt; (facet values) for certain facets. This example uses Solr’s &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt; along with &lt;strong&gt;filter tagging and excluding&lt;/strong&gt; to implement this style of faceting.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sports-store-example&quot;&gt;Sports store example&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Let’s say we have 3 facets, &lt;code dir=&quot;auto&quot;&gt;Size&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Color&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;Brand&lt;/code&gt;. This is multi-select faceting because for the &lt;code dir=&quot;auto&quot;&gt;Color&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Brand&lt;/code&gt; facets, we want the user to be able to select multiple constraints (values). The &lt;code dir=&quot;auto&quot;&gt;Size&lt;/code&gt; facet is &lt;strong&gt;single-select&lt;/strong&gt; since we’ve decided that customers in general will only be interested in one size at a time.&lt;/p&gt;
&lt;p&gt;Here is our super-fancy ASCII UI, after the user has searched for &lt;code dir=&quot;auto&quot;&gt;&quot;running shorts&quot;&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=== Size ===   === Color ===    === Brand ===&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Small] (7)    [ ] Red (2)      [ ] Nike (7)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Medium] (5)   [ ] Blue (8)     [ ] Adidas (5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Large] (6)    [ ] Green (3)    [ ] Reebok (4)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[ ] Black (5)    [ ] Under Armour (2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;(Top matches sorted by popularity displayed here... use your imagination!)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note that the Color and Brand facets have checkboxes to indicate which constraints have been selected. We’re starting off with no constraints. Below the facets is where we would display the top matching items, along with pretty pictures, prices, etc.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;1-user-selects-blue&quot;&gt;1. User selects “Blue”&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;the-wrong-way&quot;&gt;The Wrong Way&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;The user selects “Blue” so we add that as a filter and re-issue the request (we’re using Solr’s &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;running shorts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;fq&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;color:&lt;/span&gt;&lt;span&gt;Blue&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sizes:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;size&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;colors:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;brands:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;brand&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;We get back the response and update our UI from that data:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=== Size ===   === Color ===    === Brand ===&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Small] (3)    [ ] Red (0)      [ ] Nike (3)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Medium] (2)   [x] Blue (8)     [ ] Adidas (2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Large] (3)    [ ] Green (0)    [ ] Reebok (2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[ ] Black (0)    [ ] Under Armour (1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;(Top Blue running shorts displayed here)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;What’s right:&lt;/strong&gt; The &lt;code dir=&quot;auto&quot;&gt;Size&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Brand&lt;/code&gt; facets now reflect the fact that we’ve selected &lt;code dir=&quot;auto&quot;&gt;Blue&lt;/code&gt;, and that’s what we wanted. Our list of top matches also only includes &lt;code dir=&quot;auto&quot;&gt;Blue&lt;/code&gt; things, just as we wanted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What’s wrong:&lt;/strong&gt; Because we filtered out anything that wasn’t &lt;code dir=&quot;auto&quot;&gt;Blue&lt;/code&gt;, we get back &lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt; counts for other colors! But we still want the other color information so the customer can select additional colors.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;the-right-way&quot;&gt;The Right Way&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;When we compute the multi-select &lt;code dir=&quot;auto&quot;&gt;Color&lt;/code&gt; facet, we want to ignore any constraints (filters) on that facet so we will get back the correct counts for other colors. To accomplish this, we can &lt;code dir=&quot;auto&quot;&gt;tag&lt;/code&gt; filters and then selectively &lt;strong&gt;exclude filters&lt;/strong&gt; (i.e. pretend they don’t exist) by tag when faceting.&lt;/p&gt;
&lt;p&gt;The same thing applies to the multi-select &lt;code dir=&quot;auto&quot;&gt;Brand&lt;/code&gt; facet… we want any Brand selections to affect everything else (including all other facets), &lt;strong&gt;except&lt;/strong&gt; for the &lt;code dir=&quot;auto&quot;&gt;Brand&lt;/code&gt; facet itself.&lt;/p&gt;
&lt;p&gt;When the user selects &lt;code dir=&quot;auto&quot;&gt;Blue&lt;/code&gt;, we add that as a filter tagged with &lt;code dir=&quot;auto&quot;&gt;COLOR&lt;/code&gt; and re-issue the request:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;running shorts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;fq&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;COLOR&lt;/span&gt;&lt;span&gt;&lt;span&gt;}color:&lt;/span&gt;&lt;span&gt;Blue&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sizes:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;size&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;colors:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;, domain:{excludeTags:&lt;/span&gt;&lt;span&gt;COLOR&lt;/span&gt;&lt;span&gt;} },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;brands:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;brand&lt;/span&gt;&lt;span&gt;, domain:{excludeTags:&lt;/span&gt;&lt;span&gt;BRAND&lt;/span&gt;&lt;span&gt;} }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now when we get back our response, it still includes the other Colors in the &lt;code dir=&quot;auto&quot;&gt;Color&lt;/code&gt; facet.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=== Size ===   === Color ===    === Brand ===&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Small] (3)    [ ] Red (2)      [ ] Nike (3)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Medium] (2)   [x] Blue (8)     [ ] Adidas (2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Large] (3)    [ ] Green (3)    [ ] Reebok (2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[ ] Black (5)    [ ] Under Armour (1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;(Top Blue running shorts displayed here)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;domain-and-excludetags&quot;&gt;domain and excludeTags&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;domain&lt;/strong&gt; is the set of documents that facets will be calculated over. In the JSON Facet API, the &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; keyword/command is normally used to change the &lt;strong&gt;domain&lt;/strong&gt; before the facets are calculated.&lt;/p&gt;
&lt;p&gt;In our example above, we specified &lt;code dir=&quot;auto&quot;&gt;domain:{excludeTags:COLOR}&lt;/code&gt; for the &lt;code dir=&quot;auto&quot;&gt;colors&lt;/code&gt; facet. This will re-calculate the facet domain as if any filters tagged with &lt;code dir=&quot;auto&quot;&gt;COLOR&lt;/code&gt; were not applied.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-user-selects-black&quot;&gt;2. User selects “Black”&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Ok, now the user selects &lt;code dir=&quot;auto&quot;&gt;Black&lt;/code&gt; as well.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;the-wrong-way-1&quot;&gt;The Wrong Way&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;We naively add an additional filter, &lt;code dir=&quot;auto&quot;&gt;fq={!tag=COLOR}color:Black&lt;/code&gt; to the request, just as we would with traditional single-select faceting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What’s wrong:&lt;/strong&gt; Everything! Our request matches nothing and we get back all 0’s.&lt;/p&gt;
&lt;p&gt;This is because filters are logically intersected. We searched for things that were &lt;code dir=&quot;auto&quot;&gt;Blue AND Black&lt;/code&gt;, and that will match nothing (assuming our items only have a single color). What we really want is &lt;code dir=&quot;auto&quot;&gt;Blue OR Black&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;the-right-way-1&quot;&gt;The Right Way&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;We need the logical &lt;code dir=&quot;auto&quot;&gt;OR&lt;/code&gt;, or union, of all the selected colors.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;running shorts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;fq&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;COLOR&lt;/span&gt;&lt;span&gt;&lt;span&gt;}color:(&lt;/span&gt;&lt;span&gt;Blue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Black&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sizes:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;size&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;colors:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;, domain:{excludeTags:&lt;/span&gt;&lt;span&gt;COLOR&lt;/span&gt;&lt;span&gt;} },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;brands:{type:&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;, field:&lt;/span&gt;&lt;span&gt;brand&lt;/span&gt;&lt;span&gt;, domain:{excludeTags:&lt;/span&gt;&lt;span&gt;BRAND&lt;/span&gt;&lt;span&gt;} }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;=== Size ===   === Color ===    === Brand ===&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Small] (5)    [ ] Red (2)      [ ] Nike (5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Medium] (4)   [x] Blue (8)     [ ] Adidas (3)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Large] (4)    [ ] Green (3)    [ ] Reebok (3)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[x] Black (5)    [ ] Under Armour (2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;(Top Blue and Black running shorts displayed here)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note that the counts on the other facets increased to reflect the larger domain (it includes both blue and black items).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;not-just-counts&quot;&gt;Not just counts!&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Although our simple example just dealt with facet counts, multi-select faceting via &lt;code dir=&quot;auto&quot;&gt;excludeTags&lt;/code&gt; works with the broad range of features in the &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt;. The &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; change will apply to everything else under that facet, including &lt;a href=&quot;https://yonik.com/blog/solr-subfacets/&quot;&gt;Sub-facets&lt;/a&gt; and &lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;Facet Functions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;tagging-and-excluding-filters-with-excludetags&quot;&gt;Tagging and excluding filters with excludeTags&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Solr filter queries (fq parameters) can be tagged with arbitrary strings using the localParams &lt;code dir=&quot;auto&quot;&gt;{!tag=mystring}&lt;/code&gt; syntax. Example: &lt;code dir=&quot;auto&quot;&gt;fq={!tag=COLOR}color:Blue&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple filters can be tagged with the same tag. Example: &lt;code dir=&quot;auto&quot;&gt;fq={!tag=foo}one_filter&amp;#x26;fq={!tag=foo}another_filter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A single filter may be tagged with multiple tags. Example: &lt;code dir=&quot;auto&quot;&gt;fq={!tag=tag1,tag2,tag3}my_field:my_filter&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During faceting, the facet &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; may be changed to exclude filters that match certain tags via the &lt;code dir=&quot;auto&quot;&gt;excludeTags&lt;/code&gt; keyword. It’s as if the filter was never specified for that specific facet. This is useful for implementing &lt;a href=&quot;https://yonik.com/blog/multi-select-faceting/&quot;&gt;multi-select faceting&lt;/a&gt; Example: &lt;code dir=&quot;auto&quot;&gt;colors:{type:terms, field:color, domain:{excludeTags:COLOR}}&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;excludeTags&lt;/code&gt; can be multi-valued comma-separated string. Example: &lt;code dir=&quot;auto&quot;&gt;excludeTags:&quot;tag1,tag2&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;excludeTags&lt;/code&gt; can be a JSON array of tags. Example: &lt;code dir=&quot;auto&quot;&gt;excludeTags:[&quot;tag1&quot;,&quot;tag2&quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;One can exclude tags that are not used in the current request. This makes constructing requests simpler since you don’t need to worry about changing the faceting part of the request based on what filters have been applied.&lt;/li&gt;
&lt;li&gt;For nested facets, &lt;code dir=&quot;auto&quot;&gt;excludeTags&lt;/code&gt; can appear at any level of the hierarchy. They do not currently “stack” though. If a parent facet has excludeTags:tag1 and a child facet wants to additionally exclude tag2 filters, then they must currently do so explicitly with excludeTags:“tag1,tag2”. Nested exclusions are experimental and subject to change.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Solr 5.4 Features</title><link>https://yonik.com/blog/solr-5-4/</link><guid isPermaLink="true">https://yonik.com/blog/solr-5-4/</guid><pubDate>Fri, 07 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 5.4 Also see &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Solr Download Links&lt;/a&gt; and &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming Features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;filter-operator-in-lucenesolr-query-syntax&quot;&gt;filter() operator in lucene/solr query syntax&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A filter query retrieves a set of documents matching a query from the Solr filter cache. This improves performance of additional queries that use the same filter clauses. All documents matching the query produce a score of 0 by default, but this can be changed by specifying a boost.&lt;/p&gt;
&lt;p&gt;Filter Query Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;description:HDTV OR filter(+promotion:tv +promotion_date:[NOW/DAY TO NOW/DAY+7DAY])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;docvalues-fields-now-take-less-heap-memory&quot;&gt;docValues fields now take less heap memory&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Multi-valued fields with docValues (as well as binary docValues fields), previously had an on-heap index structure pointing to the on-disk (i.e. off-heap) values. This index has been moved off-heap, and directly read as needed from the index file.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;sparse-encoding-for-docvalues-fields&quot;&gt;Sparse encoding for docValues fields&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Sparse docValues fields with less than 1% of documents containing a value in the field, are now internally encoded with a new SPARSE_COMPRESSED method to save storage space.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;json-facet-api-method-parameter&quot;&gt;JSON Facet API “method” parameter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Terms/field faceting has a new parameter called “method” to give an execution hint while faceting on a field.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;method:uif&lt;/code&gt; - Stands for UninvertedField, a method of faceting indexed, multi-valued fields using top-level data structures that optimize for performance over NRT capabilities.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;method:dv&lt;/code&gt; - Stands for DocValues, a method of faceting indexed, multi-valued fields using per-segment data structures. This method mirrors faceting on real docValues fields but works by building on-heap docValues on the fly from the index when docValues aren’t available. This method is better for a quickly changing index.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;method:stream&lt;/code&gt; - This method creates each individual facet bucket (including any sub-facets) on-the-fly while streaming the response back to the requester. Currently only supports sorting by index order.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NOTE: currently, if a field is indexed with docValues, the &lt;code dir=&quot;auto&quot;&gt;dv&lt;/code&gt; method will be used even if &lt;code dir=&quot;auto&quot;&gt;method:uif&lt;/code&gt; is specified.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;docvalue-faceting-performance&quot;&gt;DocValue faceting performance&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Faceting on DocValue fields and single-valued fields with the new Facet Module (JSON Facet API), has been optimized. When sorting by count, and when there are multiple hits expected per bucket, per-segment ords are collected before being mapped to global ords.&lt;/p&gt;
&lt;p&gt;This optimization applies to the following field types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;single-valued and multi-valued string fields with docValues&lt;/li&gt;
&lt;li&gt;indexed single-valued string fields&lt;/li&gt;
&lt;li&gt;indexed multi-valued string fields, when facet.method=dv is used&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s an example of the speedups obtained when faceting over 5M documents on different single-valued fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Field with 10 unique values: +31%&lt;/li&gt;
&lt;li&gt;Field with 100 unique values: +29%&lt;/li&gt;
&lt;li&gt;Field with 1000 unique values: +59%&lt;/li&gt;
&lt;li&gt;Field with 10000 unique values: +88%&lt;/li&gt;
&lt;li&gt;Field with 1M unique values: +115%&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;clusterstate-migration-tool&quot;&gt;Clusterstate migration tool&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A collection API command &lt;code dir=&quot;auto&quot;&gt;MIGRATESTATEFORMAT&lt;/code&gt; that will migrate from an older-style shared clusterstate.json in Zookeeper, to per-collection cluster state files (state.json per collection).&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;http://localhost:8983/solr/admin/collections?action=MIGRATESTATEFORMAT&amp;#x26;collection=collection1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;configsets-management-api&quot;&gt;ConfigSets management API&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A HTTP API to &lt;code dir=&quot;auto&quot;&gt;CREATE&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;DELETE&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;LIST&lt;/code&gt; config sets (schema, solrconfig.xml, etc) in SolrCloud mode.&lt;/p&gt;
&lt;p&gt;For example, the following command creates a new configset from an existing configset:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;http://localhost:8983/solr/admin/configs?action=CREATE&amp;#x26;name=booksConfig&amp;#x26;baseConfigSet=genericTemplate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/ConfigSets+API&quot;&gt;ConfigSets API&lt;/a&gt; in the Solr reference guide for more details.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;force-a-shard-leader&quot;&gt;Force a shard leader&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;An expert-level &lt;code dir=&quot;auto&quot;&gt;FORCELEADER&lt;/code&gt; command has been added to help manually recover from a rare scenario where it looks like there are no replicas for a shard suitable to become the leader (i.e. when all of them are marked as recovering).&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-ForceLeader&quot;&gt;Force Leader&lt;/a&gt; in the collections API section of the Solr reference guide.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;more-complex-sorts-for-collapse-post-filter&quot;&gt;More complex sorts for collapse post-filter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;code dir=&quot;auto&quot;&gt;sort&lt;/code&gt; parameter was added to the &lt;code dir=&quot;auto&quot;&gt;collapse&lt;/code&gt; qparser to handle complex sorts.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fq={!collapse field=category sort=&apos;popularity desc, score desc&apos;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Collapse+and+Expand+Results&quot;&gt;Collapse and Expand Results&lt;/a&gt; in the Solr ref guide for more info on using the collapse post-filter.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;basic-auth-support-in-solrj&quot;&gt;Basic Auth support in SolrJ&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;SolrJ now has support for basic auth credentials. Those credentials need to be set for each request. Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;QueryRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solrRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;QueryRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;solrRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setBasicAuthCredentials&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;username, password&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;QueryResponse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solrRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;solrClient, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;collection1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
</content:encoded></item><item><title>Facet &amp; Analytics Performance</title><link>https://yonik.com/blog/facet-performance/</link><guid isPermaLink="true">https://yonik.com/blog/facet-performance/</guid><description>Benchmarks of Solr&apos;s faceted search and analytics capabilities including performance comparisons of the new JSON Facet API vs Stats Component + Pivot Facets</description><pubDate>Thu, 16 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h2 id=&quot;solr-facet-performance&quot;&gt;Solr Facet Performance&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;These benchmarks compare the performance of the new JSON Facet API with it’s “performance-first” architecture, and the existing (legacy) Solr Facets.&lt;/p&gt;
&lt;p&gt;Test index details:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;documents: 5M&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index segments: 25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index size: 1.74GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 single valued string fields with 10, 100, 1000, 10000, 100000, 1000000 unique values respectively.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 single valued integer fields as above.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 multi-valued string fields with 1-5 values per field, with 10, 100, 1000, 10000, 100000, 1000000 unique values respectively.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 multi-valued integer fields as above.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5% chance of any given field having no values for a particular document.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Test requests details:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Base test query and filters (the domain) matches 2,161,827 documents.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Single client thread (and both requests only use a single internal thread per request).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Single warm-up run per implementation that is discarded.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Multiple runs across all fields, with fastest time being taken for each field.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;faceting--average-performance&quot;&gt;Faceting + Average performance&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;These benchmarks test faceting on one field and finding the average value in another field per facet bucket.&lt;/p&gt;
&lt;p&gt;JSON Facet API command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;m100_5_ss&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet : { mean : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(s10_s)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Legacy Facet command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;stat1&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;mean&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;s10_s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pivot&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;stat1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;m100_5_ss&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;m100_5_ss&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;limit&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Only sorting by count was tested since legacy facets (pivot + stats component) do not support sorting buckets by anything else.&lt;/p&gt;
&lt;div&gt;&lt;iframe width=&quot;848&quot; height=&quot;562&quot; seamless frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1PsuC-B1X-0lYFwaOVdxqJN4l38yIiFOLN6kjovxQl6s/pubchart?oid=1068659354&amp;#x26;format=interactive&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div&gt;&lt;iframe width=&quot;848&quot; height=&quot;562&quot; seamless frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1PsuC-B1X-0lYFwaOVdxqJN4l38yIiFOLN6kjovxQl6s/pubchart?oid=99480766&amp;#x26;format=interactive&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div&gt;&lt;iframe width=&quot;848&quot; height=&quot;562&quot; seamless frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1PsuC-B1X-0lYFwaOVdxqJN4l38yIiFOLN6kjovxQl6s/pubchart?oid=564064153&amp;#x26;format=interactive&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
</content:encoded></item><item><title>Count Distinct in Solr</title><link>https://yonik.com/blog/solr-count-distinct/</link><guid isPermaLink="true">https://yonik.com/blog/solr-count-distinct/</guid><description>Solr faceting and unique value counts - count distinct - and HyperLogLog distributed cardinality for distinct count estimation. hll and stats component examples</description><pubDate>Sun, 17 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A 100% accurate count of distinct values (count distinct) is not generally possible without actually observing all of the values together. However there are a number of ways to estimate the count.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;unique-facet-function&quot;&gt;“unique” Facet Function&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;unique&lt;/code&gt; &lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;facet function&lt;/a&gt; is Solr’s fastest implementation to calculate the number of distinct values. It always provides exact counts on a single Solr node. For distributed search over multiple nodes, it provides exact counts when the number of values per node does not exceed 100 (by default).&lt;/p&gt;
&lt;p&gt;When the number of unique values does exceed 100 in any given shard, the following algorithm is used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It estimates the count by sending the top 100 results from each shard along with the total exact “unique” count for each shard.&lt;/li&gt;
&lt;li&gt;totalSeen is the number of actual results we saw from all shards (i.e. not deduped yet).&lt;/li&gt;
&lt;li&gt;uniqueSeen is the number of unique values we saw from all shards (i.e. deduped).&lt;/li&gt;
&lt;li&gt;notSeen is the number of unique values from each shard that were not sent (because of the 100 cutoff).&lt;/li&gt;
&lt;li&gt;factor = uniqueSeen / totalSeen (i.e. what fraction of values that we saw were unique)&lt;/li&gt;
&lt;li&gt;estimate = uniqueSeen + ( notSeen * factor ) (i.e. we simply apply the factor to the number of values we didn’t see)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example use:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/techproducts/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=*&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;*&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;unique(manu_exact)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// manu_exact is the manufacturer indexed as a single string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more facet functions, adding facet functions to each facet bucket, or sorting by facet function, see &lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;Solr Facet Functions&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;hyperloglog&quot;&gt;HyperLogLog&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;(New in Solr 5.2) The HyperLogLog algorithm was developed as an advanced statistical method of estimating the distinct number of values without using too much memory. It does add more calculation overhead however, and is thus slower than Solr’s “unique” facet function.&lt;/p&gt;
&lt;p&gt;HyperLogLog requires very high quality hashes for accurate estimation. Solr uses a port of &lt;a href=&quot;https://yonik.com/blog/murmurhash3-for-java/&quot;&gt;MurmurHash3 for Java&lt;/a&gt; to calculate these hashes.&lt;/p&gt;
&lt;p&gt;The Facet Analytics Module and the older Stats component both have support for HyperLogLog as of Solr 5.2&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;json-facet-api-hyperloglog-example&quot;&gt;JSON Facet API HyperLogLog Example&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A new “hll” facet function was added as an alternative to the existing faster (but less accurate for high cardinality) “unique” function.&lt;/p&gt;
&lt;p&gt;To get the unique number of manufacturers using the HyperLogLog algorithm:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/techproducts/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=*&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;*&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hll(manu_exact)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// manu_exact is the manufacturer indexed as a single string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If we want the number of unique manufacturers per bucket of a facet:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/techproducts/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=*&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;*&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hll(manu_exact)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And we get a response containing:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;electronics&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currency&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;stats-component-hyperloglog-example&quot;&gt;Stats Component HyperLogLog Example&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;To get the unique number of manufacturers per facet bucket using the Stats component:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/techproducts/query -d &apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;=*&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;*&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;stat1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cardinality&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;manu_exact&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pivot&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;stat1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And we get a response containing:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_counts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_queries&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_fields&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_dates&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_ranges&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_intervals&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_heatmaps&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;facet_pivot&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;electronics&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;stats_fields&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;manu_exact&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cardinality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;}}}},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currency&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;stats_fields&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;manu_exact&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cardinality&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;}}}},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;cardinality-performance&quot;&gt;Cardinality Performance&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Here is a performance comparison of the different implementations in various scenarios.&lt;/p&gt;
&lt;p&gt;Test configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Index:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;documents: 5M&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index segments: 25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index size: 1.74GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 single valued string fields with 10, 100, 1000, 10000, 100000, 1000000 unique values respectively.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 single valued integer fields as above.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 multi-valued string fields with 1-5 values per field, with 10, 100, 1000, 10000, 100000, 1000000 unique values respectively.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 multi-valued integer fields as above.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5% chance of any given field having no values for a particular document.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Queries:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Base test query and filters (the domain) matches 2,161,827 documents.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Single client thread (and both requests only use a single internal thread per request).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Single warm-up run per implementation that is discarded.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Multiple runs across all fields, with fastest time being taken for each field.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Legacy Faceting command (stats component + pivot faceting):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;stat1&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;cardinality&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;s10_s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pivot&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;stats&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;stat1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;m100_5_ss&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;m100_5_ss&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;limit&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;JSON Faceting command (new Facet Module):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;m100_5_ss&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet : { stat1:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hll(s10_s)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This first test facets on the multi-valued string field m100_5_ss (it has up to 5 values per field, and 100 unique values in total). Then for the top 10 buckets, the cardinality of the single-valued string field (the “stat field”) is calculated. The chart below shows performance for different number of unique values in the stat field.&lt;/p&gt;
&lt;div&gt;&lt;iframe width=&quot;848.3078417591651&quot; height=&quot;562.2222412882788&quot; seamless frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1PsuC-B1X-0lYFwaOVdxqJN4l38yIiFOLN6kjovxQl6s/pubchart?oid=441315587&amp;#x26;format=interactive&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;This next test reverses the 2 fields above, first faceting on the single valued string field s100_s (it has 100 unique values in total) and then calculating cardinality over multi-valued string fields with different numbers of unique values in the index.&lt;/p&gt;
&lt;div&gt;&lt;iframe width=&quot;848.3078417591651&quot; height=&quot;562.2222412882788&quot; seamless frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1PsuC-B1X-0lYFwaOVdxqJN4l38yIiFOLN6kjovxQl6s/pubchart?oid=821638128&amp;#x26;format=interactive&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;The last test facets on the integer field s100_i and then calculates cardinality over another integer field with varying number of unique terms in the index.&lt;/p&gt;
&lt;div&gt;&lt;iframe width=&quot;848.3078417591651&quot; height=&quot;562.2222412882788&quot; seamless frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1PsuC-B1X-0lYFwaOVdxqJN4l38yIiFOLN6kjovxQl6s/pubchart?oid=100642131&amp;#x26;format=interactive&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
</content:encoded></item><item><title>Solr 5.3 Features</title><link>https://yonik.com/blog/solr-5-3/</link><guid isPermaLink="true">https://yonik.com/blog/solr-5-3/</guid><description>Here&apos;s an overview of some of the new features that will be in Apache Solr 5.3</description><pubDate>Sun, 17 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s an overview of some of the new features in Solr 5.3 Also see &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Solr Download Links&lt;/a&gt; and &lt;a href=&quot;https://yonik.com/blog/solr-7/&quot;&gt;upcoming Features of the next Solr release&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;faceting-nested-documents&quot;&gt;Faceting Nested Documents&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://yonik.com/blog/json-facet-api/&quot;&gt;JSON Facet API&lt;/a&gt; can now change the domain for facet commands, essentially doing a block join and moving from parents to children, or children to parents before calculating the facet data.&lt;/p&gt;
&lt;p&gt;For example, if you indexed chapters with pages as nested child documents, then you could map from chapters to pages before faceting by adding the following parameter to the facet command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain : { blockChildren : &quot;type:chapter&quot; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or if you started with pages, you could map to chapters with&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain : { blockParent : &quot;type:chapter&quot; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note that in both cases, we provide the parent filter (how parent documents are defined) of “type:chapter” regardless of which direction we are mapping.&lt;/p&gt;
&lt;p&gt;See this &lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/&quot;&gt;Nested Objects&lt;/a&gt; tutorial for complete examples of combining faceting and block join / nested documents.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;facet-performance-improvements&quot;&gt;Facet Performance Improvements&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Major improvements in performance of the new Facet Module / JSON Facet API. See the &lt;a href=&quot;https://yonik.com/blog/facet-performance/&quot;&gt;facet performance benchmarks&lt;/a&gt; for more details and benchmark results.  &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;query-and-range-facets-under-pivot-facets&quot;&gt;Query and Range Facets under Pivot Facets&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Just like the JSON Facet API, pivot facets can how nest other facet types such as range and query facets.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;r1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gap&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;q1&lt;/span&gt;&lt;span&gt;}popularity:[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pivot&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{!&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;r1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;q1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The equivalent in the JSON Facet API would be:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;r1 : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start : &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end : &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gap : &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q1 : { query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;popularity:[8 TO 10]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;more-like-this-query-parser-options&quot;&gt;More Like This Query Parser options&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The MoreLikeThis QParser &lt;code dir=&quot;auto&quot;&gt;mlt&lt;/code&gt; now supports all options provided by the MLT Handler. The query parser is much more versatile than the handler as it works in cloud mode as well as anywhere a normal query can be specified.&lt;/p&gt;
&lt;p&gt;Example (on techproducts index):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q={!mlt qf=name mintf=1 mindf=1}SP2514N&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;More documentation on the mlt parser can be found in the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-MoreLikeThisQueryParser&quot;&gt;Solr Ref Guide&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;schema-api-support-in-solrj&quot;&gt;Schema API support in SolrJ&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The new SchemaRequest Java class in SolrJ can be used to make requests to the Schema API.&lt;/p&gt;
&lt;p&gt;Also see the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Schema+API&quot;&gt;Solr Schema API&lt;/a&gt; itself in the ref guide.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;scoring-mode-for-query-time-join-and-block-join&quot;&gt;Scoring mode for query-time join and block join&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Solr’s pseudo-join query parser has a new optional attribute &lt;code dir=&quot;auto&quot;&gt;score&lt;/code&gt; that can be used specify the scores produced on the resulting documents. It’s value can be &lt;code dir=&quot;auto&quot;&gt;min&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;max&lt;/code&gt;,&lt;code dir=&quot;auto&quot;&gt;avg&lt;/code&gt;,or &lt;code dir=&quot;auto&quot;&gt;total&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Query-time join example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q={!join from=author_id to=id score=total}blog_text:awesome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Block join example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;q={!parent of=type:author score=total}blog_text:awesome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/&quot;&gt;Nested Objects in Solr&lt;/a&gt; for more information on nested documents and block join.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;query-comments&quot;&gt;Query Comments&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Lucene/Solr query syntax (i.e. Solr’s dialect of the lucene syntax) now supports nested C-style comments.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;+cat:electronics /* this is a comment */ +name:HDTV&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;smile-data-format&quot;&gt;Smile data format&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Smile_(data_interchange_format)&quot;&gt;Smile&lt;/a&gt; is a binary data interchange format that is very close to Solr’s own “javabin” (encoded sizes are very close). Adding &lt;code dir=&quot;auto&quot;&gt;wt=smile&lt;/code&gt; to a request will cause the response to come back in this format.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;minmax-for-multi-valued-docvalues-fields&quot;&gt;min/max for multi-valued docValues fields&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A second parameter has been added to the &lt;code dir=&quot;auto&quot;&gt;field&lt;/code&gt; function to select the minimum or maximum value of a multi-valued field with docValues.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sort=field(my_dv_field,max) asc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;http-basic-authentication&quot;&gt;HTTP Basic Authentication&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In addition to many other improvements in the security framework, Solr now includes an AuthenticationPlugin implementing HTTP Basic Auth that stores credentials securely in ZooKeeper. This is a simple way to require a username and password for anyone accessing Solr’s admin screen or APIs.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Basic+Authentication+Plugin&quot;&gt;Basic Authentication Plugin&lt;/a&gt; section of the Solr ref guide under the &lt;a href=&quot;https://cwiki.apache.org/confluence/display/solr/Securing+Solr&quot;&gt;Securing Solr&lt;/a&gt; section.&lt;/p&gt;
</content:encoded></item><item><title>JSON Facet API</title><link>https://yonik.com/blog/json-facet-api/</link><guid isPermaLink="true">https://yonik.com/blog/json-facet-api/</guid><description>Solr JSON Facet API has field / term facets, range facets, query facets, nested facets or sub-facets and stats / analytics like sum, avg, unique, percentile</description><pubDate>Fri, 17 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Related Pages&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;Facet Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yonik.com/blog/solr-subfacets/&quot;&gt;Sub-Facets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yonik.com/blog/multi-select-faceting/&quot;&gt;Multi-Select Faceting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/#faceting&quot;&gt;Nested Documents / Block Join Faceting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yonik.com/blog/facet-performance/&quot;&gt;Facet Performance Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Solr 5 has a completely re-written faceted search and analytics module with a structured JSON API to control the faceting and analytics commands. NOTE: Some examples use syntax only supported in later Solr 5 releases, or even Solr 6. &lt;a href=&quot;https://yonik.com/download/&quot;&gt;Download a recent Solr release&lt;/a&gt; or snapshot to try them out.&lt;/p&gt;
&lt;p&gt;The structured nature of nested &lt;a href=&quot;https://yonik.com/blog/solr-subfacets/&quot;&gt;sub-facets&lt;/a&gt; are more naturally expressed in a nested structure like JSON rather than the flat structure that normal query parameters provide.&lt;/p&gt;
&lt;p&gt;Goals of the new Faceting Module:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First class JSON support&lt;/li&gt;
&lt;li&gt;Easier programmatic construction of complex nested facet commands&lt;/li&gt;
&lt;li&gt;Support a much more canonical response format that is easier for clients to parse&lt;/li&gt;
&lt;li&gt;First class analytics support&lt;/li&gt;
&lt;li&gt;Ability to sort facet buckets by any calculated metric&lt;/li&gt;
&lt;li&gt;Support a cleaner way to do distributed faceting&lt;/li&gt;
&lt;li&gt;Support better integration with other search features&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course if you prefer to use Solr’s existing faceting capabilities, that’s fine too. You can even use both at once if you want!&lt;/p&gt;
&lt;p&gt;UPDATE: The JSON Facet API is now part of the &lt;a href=&quot;https://yonik.com/blog/solr-json-request-api/&quot;&gt;JSON Request API&lt;/a&gt;, so a complete request may be expressed in JSON.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;ease-of-use&quot;&gt;Ease of Use&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Some of the ease-of-use enhancements over traditional Solr faceting come from the inherent nested structure of JSON. As an example, here is the faceting command for two different range facets using &lt;strong&gt;Solr’s flat legacy API&lt;/strong&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;facet=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;facet.range={!key=age_ranges}age&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;f.age.facet.range.start=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;f.age.facet.range.end=100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;f.age.facet.range.gap=10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;facet.range={!key=price_ranges}price&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;f.price.facet.range.start=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;f.price.facet.range.end=1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x26;f.price.facet.range.gap=50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And here is the equivalent faceting command in the new &lt;strong&gt;JSON Faceting API&lt;/strong&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;age_ranges: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;age&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start : &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end : &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gap : &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;price_ranges: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start : &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end : &lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gap : &lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;These aren’t even nested facets, but already one can see how much nicer the JSON API looks. With deeply nested sub-facets and statistics, the clarity of the inherently nested JSON API only grows.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;json-extensions&quot;&gt;JSON extensions&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;A number of JSON extensions have been implemented to further increase the clarity and ease of constructing a JSON faceting command by hand. For example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{  &lt;/span&gt;&lt;span&gt;// this is a single-line comment, which can help add clarity to large JSON commands&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;/* traditional C-style comments are also supported */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; , &lt;/span&gt;&lt;span&gt;// Simple strings can occur unquoted&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;y : &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;unique(manu)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Strings can also use single quotes (easier to embed in another String)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;debugging-json&quot;&gt;Debugging JSON&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Nicely indented JSON is very easy to understand. If you get a large piece of non-indented JSON somehow, and are trying to make sense of it, you can cut and paste into one of the online validators: &lt;a href=&quot;http://jsonlint.com&quot;&gt;http://jsonlint.com&lt;/a&gt; &lt;a href=&quot;http://jsonformatter.curiousconcept.com&quot;&gt;http://jsonformatter.curiousconcept.com&lt;/a&gt; Both of these validators will indent your JSON, even when it contains extensions unsupported by them (such as comments or bare strings).&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;facet-types&quot;&gt;Facet Types&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;There are two types of facets, one that breaks up the domain into multiple &lt;strong&gt;buckets&lt;/strong&gt;, and aggregations / &lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;facet functions&lt;/a&gt; that provide information about the set of documents belonging to each bucket.&lt;/p&gt;
&lt;p&gt;Faceting can be &lt;a href=&quot;https://yonik.com/blog/solr-subfacets/&quot;&gt;nested&lt;/a&gt;! Any bucket produced by faceting can further be broken down into multiple buckets by a sub-facet.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;statistics-are-facets&quot;&gt;Statistics are facets&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Statistics are now fully integrated into faceting. Since we start off with a single facet bucket with a domain defined by the main query and filters, we can even ask for statistics for this top level bucket, before breaking up into further buckets via faceting. Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,           &lt;/span&gt;&lt;span&gt;// the average of the price field will appear under &quot;x&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;y : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;unique(manufacturer)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// the number of unique manufacturers will appear under &quot;y&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://yonik.com/blog/solr-facet-functions/&quot;&gt;facet functions&lt;/a&gt; for a complete list of the available aggregation functions.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;json-facet-syntax&quot;&gt;JSON Facet Syntax&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The general form of the JSON facet commands are: &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;facet_name&gt; : { &amp;#x3C;facet_type&gt; : &amp;#x3C;facet_parameter(s)&gt; }&lt;/code&gt; Example: &lt;code dir=&quot;auto&quot;&gt;top_authors : { terms : { field : authors, limit : 5 } }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After Solr 5.2, a flatter structure with a “type” field may also be used: &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;facet_name&gt; : { &quot;type&quot; : &amp;#x3C;facet_type&gt; , &amp;#x3C;other_facet_parameter(s)&gt; }&lt;/code&gt; Example: &lt;code dir=&quot;auto&quot;&gt;top_authors : { type : terms, field : authors, limit : 5 }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The results will appear in the response under the facet name specified. Facet commands are specified using &lt;code dir=&quot;auto&quot;&gt;json.facet&lt;/code&gt; request parameters.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;test-using-curl&quot;&gt;Test Using Curl&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;To test out different facet requests by hand, it’s easiest to use “curl” from the command line. Example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//localhost:8983/solr/query -d &apos;q=*:*&amp;#x26;rows=0&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;facet&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categories:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sort : { x : &lt;/span&gt;&lt;span&gt;desc&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;y : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sum(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;terms-facet&quot;&gt;Terms Facet&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The terms facet, or field facet, produces buckets from the unique values of a field. The field needs to be indexed or have docValues.&lt;/p&gt;
&lt;p&gt;The simplest form of the terms facet&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_genres : { terms : &lt;/span&gt;&lt;span&gt;genre_field&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;An expanded form allows for more parameters:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top_genres : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;genre_field&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;limit : &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mincount : &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Example response:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;top_genres&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Science Fiction&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;143&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Fantasy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;122&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Biography&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;28&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;field&lt;/code&gt; - The field name to facet over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;offset&lt;/code&gt; - Used for paging, this skips the first N buckets. Defaults to 0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;limit&lt;/code&gt; - Limits the number of buckets returned. Defaults to 10.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;mincount&lt;/code&gt; - Only return buckets with a count of at least this number. Defaults to 1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;sort&lt;/code&gt; - Specifies how to sort the buckets produced. “count” specifies document count, “index” sorts by the index (natural) order of the bucket value. One can also sort by any facet function / statistic that occurs in the bucket. The default is “count desc”. This parameter may also be specified in JSON like &lt;code dir=&quot;auto&quot;&gt;sort:{count:desc}&lt;/code&gt;. The sort order may either be “asc” or “desc”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;missing&lt;/code&gt; - A boolean that specifies if a special “missing” bucket should be returned that is defined by documents without a value in the field. Defaults to false.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;numBuckets&lt;/code&gt; - A boolean. If true, adds “numBuckets” to the response, an integer representing the number of buckets for the facet (as opposed to the number of buckets returned). Defaults to false.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;allBuckets&lt;/code&gt; - A boolean. If true, adds an “allBuckets” bucket to the response, representing the union of all of the buckets. For multi-valued fields, this is different than a bucket for all of the documents in the domain since a single document can belong to multiple buckets. Defaults to false.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;prefix&lt;/code&gt; - Only produce buckets for terms starting with the specified prefix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;method&lt;/code&gt; - Provides an execution hint for how to facet the field.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;method:uif&lt;/code&gt; - Stands for UninvertedField, a method of faceting indexed, multi-valued fields using top-level data structures that optimize for performance over NRT capabilities.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;method:dv&lt;/code&gt; - Stands for DocValues, a method of faceting indexed, multi-valued fields using per-segment data structures. This method mirrors faceting on real docValues fields but works by building on-heap docValues on the fly from the index when docValues aren’t available. This method is better for a quickly changing index.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;method:stream&lt;/code&gt; - This method creates each individual facet bucket (including any sub-facets) on-the-fly while streaming the response back to the requester. Currently only supports sorting by index order.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;query-facet&quot;&gt;Query Facet&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The query facet produces a single bucket that matches the specified query.&lt;/p&gt;
&lt;p&gt;An example of the simplest form of the query facet&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;high_popularity : { query : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;popularity:[8 TO 10]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;An expanded form allows for more parameters (or sub-facets / facet functions):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;high_popularity : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;q : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;popularity:[8 TO 10]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;facet : { average_price : &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;avg(price)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Example response:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;high_popularity&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;147&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;average_price&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;74.25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;range-facet&quot;&gt;Range Facet&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The range facet produces multiple range buckets over numeric fields or date fields.&lt;/p&gt;
&lt;p&gt;Range facet example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prices : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type : &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;field : &lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start : &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end : &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gap : &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Example response:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;prices&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;buckets&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0.0&lt;/span&gt;&lt;span&gt;,  &lt;/span&gt;&lt;span&gt;// the bucket value represents the start of each range.  This bucket covers 0-20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;20.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;40.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;60.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;80.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To ease migration, these parameter names, values, and semantics were taken directly from the old-style (non JSON) Solr range faceting.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;field&lt;/code&gt; - The numeric field or date field to produce range buckets from&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;mincount&lt;/code&gt; - Minimum document count for the bucket to be included in the response. Defaults to 0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;start&lt;/code&gt; - Lower bound of the ranges&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;end&lt;/code&gt; - Upper bound of the ranges&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;gap&lt;/code&gt; - Size of each range bucket produced&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;hardend&lt;/code&gt; - A boolean, which if true means that the last bucket will end at “end” even if it is less than “gap” wide. If false, the last bucket will be “gap” wide, which may extend past “end”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;other&lt;/code&gt; - This param indicates that in addition to the counts for each range constraint between facet.range.start and facet.range.end, counts should also be computed for…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;before&quot;&lt;/code&gt; all records with field values lower then lower bound of the first range&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;after&quot;&lt;/code&gt; all records with field values greater then the upper bound of the last range&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;between&quot;&lt;/code&gt; all records with field values between the start and end bounds of all ranges&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;none&quot;&lt;/code&gt; compute none of this information&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;all&quot;&lt;/code&gt; shortcut for before, between, and after&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;include&lt;/code&gt; - By default, the ranges used to compute range faceting between facet.range.start and facet.range.end are inclusive of their lower bounds and exclusive of the upper bounds. The “before” range is exclusive and the “after” range is inclusive. This default, equivalent to lower below, will not result in double counting at the boundaries. This behavior can be modified by the facet.range.include param, which can be any combination of the following options…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;lower&quot;&lt;/code&gt; all gap based ranges include their lower bound&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;upper&quot;&lt;/code&gt; all gap based ranges include their upper bound&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;edge&quot;&lt;/code&gt; the first and last gap ranges include their edge bounds (ie: lower for the first one, upper for the last one) even if the corresponding upper/lower option is not specified&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;outer&quot;&lt;/code&gt; the “before” and “after” ranges will be inclusive of their bounds, even if the first or last ranges already include those boundaries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;&quot;all&quot;&lt;/code&gt; shorthand for lower, upper, edge, outer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;common-parameters&quot;&gt;Common Parameters&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Parameters that all faceting methods have in common include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; - &lt;a href=&quot;https://yonik.com/blog/facet-domains/&quot;&gt;Facet domain transformations&lt;/a&gt;, to change the incoming domain of the facet command before faceting is executed. This is useful for &lt;a href=&quot;https://yonik.com/blog/multi-select-faceting/&quot;&gt;multi-select faceting&lt;/a&gt; and &lt;a href=&quot;https://yonik.com/blog/solr-nested-objects/#faceting&quot;&gt;nested document (block join) faceting&lt;/a&gt;. Additional filters to be applied to the domain can also be specified here.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>