Class CountFacetRecorder
- All Implemented Interfaces:
FacetRecorder
FacetRecorder
to count facets.
TODO: add an option to keep counts in an array, to improve performance for facets with small
number of ordinals e.g. range facets. Options: - LeafFacetCutter
can inform LeafFacetRecorder
about expected number of facet ordinals (FacetFieldCollector
can orchestrate that). If expeted facet ord
number is below some threshold - use array instead of a map? - first 100/1k counts in array, the
rest - in a map; the limit can also be provided in a constructor? It is similar to what
LongValuesFacetCounts does today.
TODO: We can also consider collecting 2 (3, 4, ..., can be parametrizes) slices to a single sync map which can reduce thread contention compared to single sync map for all slices; at the same time there will be less work for reduce method. So far reduce wasn't a bottleneck for us, but it is definitely not free.
TODO: If we come back to some for of synchronized count maps, we should be more careful what we acquire locks for - we used to lock addTo method itself, but it could be faster if we only synchronized after computing the key's hash; or we can lock the entire map only if we need to insert key, and lock single key otherwise?
- WARNING: This API is experimental and might change in incompatible ways in the next release.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionboolean
contains
(int ordinal) Check if any data was recorded for provided facet ordinal.int
getCount
(int ord) Get count for provided ordinal.getLeafRecorder
(LeafReaderContext context) Get leaf recorder.boolean
isEmpty()
True if there are no recordsReturn next collected ordinal, orOrdinalIterator.NO_MORE_ORDS
void
reduce
(FacetCutter facetCutter) Reduce leaf recorder results into this recorder.
-
Constructor Details
-
CountFacetRecorder
public CountFacetRecorder()Create.
-
-
Method Details
-
getCount
public int getCount(int ord) Get count for provided ordinal. -
getLeafRecorder
Description copied from interface:FacetRecorder
Get leaf recorder.- Specified by:
getLeafRecorder
in interfaceFacetRecorder
-
recordedOrds
Description copied from interface:FacetRecorder
Return next collected ordinal, orOrdinalIterator.NO_MORE_ORDS
- Specified by:
recordedOrds
in interfaceFacetRecorder
-
isEmpty
public boolean isEmpty()Description copied from interface:FacetRecorder
True if there are no records- Specified by:
isEmpty
in interfaceFacetRecorder
-
reduce
Description copied from interface:FacetRecorder
Reduce leaf recorder results into this recorder. IfFacetCutter.getOrdinalsToRollup()
result is not null, it also rolls up values.After this method is called, it's illegal to add values to recorder, i.e. calling
FacetRecorder.getLeafRecorder(org.apache.lucene.index.LeafReaderContext)
orLeafFacetRecorder.record(int, int)
on its leaf recorders.- Specified by:
reduce
in interfaceFacetRecorder
- Throws:
IOException
-
contains
public boolean contains(int ordinal) Description copied from interface:FacetRecorder
Check if any data was recorded for provided facet ordinal.- Specified by:
contains
in interfaceFacetRecorder
-