## org.apache.lucene.search.grouping
Class BlockGroupingCollector

    java.lang.Object
      org.apache.lucene.search.Collector
          org.apache.lucene.search.grouping.BlockGroupingCollector

    public class BlockGroupingCollector

extends org.apache.lucene.search.Collector

BlockGroupingCollector performs grouping with a single pass collector, as long as you are grouping by a doc block field, ie all documents sharing a given group value were indexed as a doc block using the atomic `IndexWriter.addDocuments(java.util.Collection<org.apache.lucene.document.Document>)` or `IndexWriter.updateDocuments(org.apache.lucene.index.Term, java.util.Collection<org.apache.lucene.document.Document>)` API.

This results in faster performance (~25% faster QPS) than the two-pass grouping collectors, with the tradeoff being that the documents in each group must always be indexed as a block. This collector also fills in TopGroups.totalGroupCount without requiring the separate `TermAllGroupsCollector`. However, this collector does not fill in the groupValue of each group; this field will always be null.

NOTE: this collector makes no effort to verify the docs were in fact indexed as a block, so it's up to you to ensure this was the case.

See `org.apache.lucene.search.grouping` for more details including a full code example.

WARNING: This API is experimental and might change in incompatible ways in the next release.

Constructor Summary
`BlockGroupingCollector(org.apache.lucene.search.Sort groupSort, int topNGroups, boolean needsScores, org.apache.lucene.search.Filter lastDocPerGroup)` Create the single pass collector.

Method Summary
`boolean` `acceptsDocsOutOfOrder()`
`void` `collect(int doc)`
`TopGroups` `getTopGroups(org.apache.lucene.search.Sort withinGroupSort, int groupOffset, int withinGroupOffset, int maxDocsPerGroup, boolean fillSortFields)` Returns the grouped results.
`void` `setNextReader(org.apache.lucene.index.IndexReader reader, int docBase)`
`void` `setScorer(org.apache.lucene.search.Scorer scorer)`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Constructor Detail

### BlockGroupingCollector

    public BlockGroupingCollector(org.apache.lucene.search.Sort groupSort,
                                  int topNGroups,
                                  boolean needsScores,
                                  org.apache.lucene.search.Filter lastDocPerGroup)
                           throws IOException

  Create the single pass collector.

  Parameters:
    `groupSort` - The `Sort` used to sort the groups. The top sorted document within each group according to groupSort, determines how that group sorts against other groups. This must be non-null, ie, if you want to groupSort by relevance use Sort.RELEVANCE.
    `topNGroups` - How many top groups to keep.
    `needsScores` - true if the collected documents require scores, either because relevance is included in the withinGroupSort or because you plan to pass true for either getSscores or getMaxScores to `getTopGroups(org.apache.lucene.search.Sort, int, int, int, boolean)`
    `lastDocPerGroup` - a `Filter` that marks the last document in each group.
  Throws:
    `IOException`

Method Detail

### getTopGroups

    public TopGroups getTopGroups(org.apache.lucene.search.Sort withinGroupSort,
                                  int groupOffset,
                                  int withinGroupOffset,
                                  int maxDocsPerGroup,
                                  boolean fillSortFields)
                           throws IOException

  Returns the grouped results. Returns null if the number of groups collected is <= groupOffset.

  NOTE: This collector is unable to compute the groupValue per group so it will always be null. This is normally not a problem, as you can obtain the value just like you obtain other values for each matching document (eg, via stored fields, via FieldCache, etc.)

  Parameters:
    `withinGroupSort` - The `Sort` used to sort documents within each group. Passing null is allowed, to sort by relevance.
    `groupOffset` - Which group to start from
    `withinGroupOffset` - Which document to start from within each group
    `maxDocsPerGroup` - How many top documents to keep within each group.
    `fillSortFields` - If true then the Comparable values for the sort fields will be set
  Throws:
    `IOException`

### setScorer

    public void setScorer(org.apache.lucene.search.Scorer scorer)
                   throws IOException

  Specified by:
    `setScorer` in class `org.apache.lucene.search.Collector`
  Throws:
    `IOException`

### collect

    public void collect(int doc)
                 throws IOException

  Specified by:
    `collect` in class `org.apache.lucene.search.Collector`
  Throws:
    `IOException`

### acceptsDocsOutOfOrder

    public boolean acceptsDocsOutOfOrder()

  Specified by:
    `acceptsDocsOutOfOrder` in class `org.apache.lucene.search.Collector`

### setNextReader

    public void setNextReader(org.apache.lucene.index.IndexReader reader,
                              int docBase)
                       throws IOException

  Specified by:
    `setNextReader` in class `org.apache.lucene.search.Collector`
  Throws:
    `IOException`