BlockJoin facets allow you to aggregate children facet counts by their parents.
It is a common requirement that if a parent document has several children documents, all of them need to increment facet value count only once. This functionality is provided by BlockJoinDocSetFacetComponent
, and BlockJoinFacetComponent
just an alias for compatibility.
This functionality is considered deprecated. Users are encouraged to use uniqueBlock(_root_) aggregation under a terms facet in the JSON Facet API.
If this component is used, it must be explicitly enabled for a request handler in solrconfig.xml , in the same way as any other search component.
|
This example shows how you could add this search components to solrconfig.xml
and define it in request handler:
<searchComponent name="bjqFacetComponent" class="org.apache.solr.search.join.BlockJoinDocSetFacetComponent"/>
<requestHandler name="/bjqfacet" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="shards.qt">/bjqfacet</str>
</lst>
<arr name="last-components">
<str>bjqFacetComponent</str>
</arr>
</requestHandler>
This component can be added into any search request handler. This component work with distributed search in SolrCloud mode.
Documents should be added in children-parent blocks as described in indexing nested child documents. Examples:
<add>
<doc>
<field name="id">1</field>
<field name="type_s">parent</field>
<doc>
<field name="id">11</field>
<field name="COLOR_s">Red</field>
<field name="SIZE_s">XL</field>
<field name="PRICE_i">6</field>
</doc>
<doc>
<field name="id">12</field>
<field name="COLOR_s">Red</field>
<field name="SIZE_s">XL</field>
<field name="PRICE_i">7</field>
</doc>
<doc>
<field name="id">13</field>
<field name="COLOR_s">Blue</field>
<field name="SIZE_s">L</field>
<field name="PRICE_i">5</field>
</doc>
</doc>
<doc>
<field name="id">2</field>
<field name="type_s">parent</field>
<doc>
<field name="id">21</field>
<field name="COLOR_s">Blue</field>
<field name="SIZE_s">XL</field>
<field name="PRICE_i">6</field>
</doc>
<doc>
<field name="id">22</field>
<field name="COLOR_s">Blue</field>
<field name="SIZE_s">XL</field>
<field name="PRICE_i">7</field>
</doc>
<doc>
<field name="id">23</field>
<field name="COLOR_s">Red</field>
<field name="SIZE_s">L</field>
<field name="PRICE_i">5</field>
</doc>
</doc>
</add>
Queries are constructed the same way as for a Parent Block Join query. For example:
http://localhost:8983/solr/bjqfacet?q={!parent which=type_s:parent}SIZE_s:XL&child.facet.field=COLOR_s
As a result we should have facets for Red(1) and Blue(1), because matches on children id=11
and id=12
are aggregated into single hit into parent with id=1
.
The key components of the request shown above are:
/bjqfacet?
-
The name of the request handler that has been defined with a block join facet component enabled.
q={!parent which=type_s:parent}SIZE_s:XL
-
The mandatory parent query as a main query. The parent query could also be a subordinate clause in a more complex query.
&child.facet.field=COLOR_s
-
The child document field, which might be repeated many times with several fields, as necessary.