Uploaded image for project: 'Solr'
  1. Solr
  2. SOLR-4465

Configurable Collectors



    • Type: New Feature
    • Status: Closed
    • Priority: Major
    • Resolution: Abandoned
    • Affects Version/s: 4.1
    • Fix Version/s: 4.8
    • Component/s: search
    • Labels:


      This ticket provides a patch to add pluggable collectors to Solr. This patch was generated and tested with Solr 4.1.

      This is how the patch functions:

      Collectors are plugged into Solr in the solconfig.xml using the new collectorFactory element. For example:

      <collectorFactory name="default" class="solr.CollectorFactory"/>
      <collectorFactory name="sum" class="solr.SumCollectorFactory"/>

      The elements above define two collector factories. The first one is the "default" collectorFactory. The class attribute points to org.apache.solr.handler.component.CollectorFactory, which implements logic that returns the default TopScoreDocCollector and TopFieldCollector.

      To create your own collectorFactory you must subclass the default CollectorFactory and at a minimum override the getCollector method to return your new collector.

      The parameter "cl" turns on pluggable collectors:


      If cl is not in the parameters, Solr will automatically use the default collectorFactory.

      Pluggable Doclist Sorting With the Docs Collector

      You can specify two types of pluggable collectors. The first type is the docs collector. For example:


      The above param points to a named collectorFactory in the solrconfig.xml to construct the collector. The docs collectorFactorys must return a collector that extends the TopDocsCollector base class. Docs collectors are responsible for collecting the doclist.

      You can specify only one docs collector per query.

      You can pass parameters to the docs collector using local params syntax. For example:

      cl.docs={! sort=mycustomesort}mycollector

      If cl=true and a docs collector is not specified, Solr will use the default collectorFactory to create the docs collector.

      Pluggable Custom Analytics With Delegating Collectors

      You can also specify any number of custom analytic collectors with the "cl.analytic" parameter. Analytic collectors are designed to collect something else besides the doclist. Typically this would be some type of custom analytic. For example:


      The parameter above specifies a analytic collector named sum. Like the docs collectors, "sum" points to a named collectorFactory in the solrconfig.xml. You can specificy any number of analytic collectors by adding additional cl.analytic parameters.

      Analytic collector factories must return Collector instances that extend DelegatingCollector.

      A sample analytic collector is provided in the patch through the org.apache.solr.handler.component.SumCollectorFactory.

      This collectorFactory provides a very simple DelegatingCollector that groups by a field and sums a column of floats. The sum collector is not designed to be a fully functional sum function but to be a proof of concept for pluggable analytics through delegating collectors.

      You can send parameters to analytic collectors with solr local param syntax.

      For example:

      cl.analytic={! id=1 groupby=field1 column=field2}sum

      The "id" parameter is mandatory for analytic collectors and is used to identify the output from the collector. In this example the "groupby" and "column" params tell the sum collector which field to group by and sum.

      Analytic collectors are passed a reference to the ResponseBuilder and can place maps with analytic output directory into the SolrQueryResponse with the add() method.

      Maps that are placed in the SolrQueryResponse are automatically added to the outgoing response. The response will include a list named cl.analytic.<id>, where id is specified in the local param.

      Distributed Search

      The CollectorFactory also has a method called merge(). This method aggregates the results from each of the shards during distributed search. The "default" CollectoryFactory implements the default merge logic for merging documents from each shard. If you define a different docs collector you can override the default merge method to merge documents in accordance with how they are collected at the shard level.

      With analytic collectors, you'll need to override the merge method to merge the analytic output from the shards. An example of how this works is provided in the SumCollectorFactory.

      Each collectorFactory, that is specified in the http parameters, will have its merge method applied by the Solr aggregator node.

      Testing the Patch With Sample Data

      1) Apply patch to Solr 4.1
      2) Load sample data
      3) Send the http command:



        1. SOLR-4465.patch
          4 kB
          Joel Bernstein
        2. SOLR-4465.patch
          5 kB
          Joel Bernstein
        3. SOLR-4465.patch
          7 kB
          Joel Bernstein
        4. SOLR-4465.patch
          10 kB
          Joel Bernstein
        5. SOLR-4465.patch
          14 kB
          Joel Bernstein
        6. SOLR-4465.patch
          15 kB
          Joel Bernstein
        7. SOLR-4465.patch
          31 kB
          Joel Bernstein
        8. SOLR-4465.patch
          30 kB
          Joel Bernstein
        9. SOLR-4465.patch
          31 kB
          Joel Bernstein
        10. SOLR-4465.patch
          33 kB
          Joel Bernstein
        11. SOLR-4465.patch
          37 kB
          Joel Bernstein
        12. SOLR-4465.patch
          39 kB
          Joel Bernstein
        13. SOLR-4465.patch
          44 kB
          Joel Bernstein
        14. SOLR-4465.patch
          45 kB
          Joel Bernstein
        15. SOLR-4465.patch
          45 kB
          Joel Bernstein
        16. SOLR-4465.patch
          47 kB
          Joel Bernstein
        17. SOLR-4465.patch
          47 kB
          Joel Bernstein

          Issue Links



              • Assignee:
                jbernste Joel Bernstein
              • Votes:
                10 Vote for this issue
                22 Start watching this issue


                • Created: