Package org.apache.lucene.spatial.prefix

# Class RecursivePrefixTreeStrategy

java.lang.Object
org.apache.lucene.spatial.SpatialStrategy
org.apache.lucene.spatial.prefix.PrefixTreeStrategy
org.apache.lucene.spatial.prefix.RecursivePrefixTreeStrategy

Direct Known Subclasses:
  `NumberRangePrefixTreeStrategy`

public class RecursivePrefixTreeStrategy extends PrefixTreeStrategy
A `PrefixTreeStrategy` which uses `AbstractVisitingPrefixTreeQuery`. This strategy has support for searching non-point shapes (note: not tested). Even a query shape with distErrPct=0 (fully precise to the grid) should have good performance for typical data, unless there is a lot of indexed data coincident with the shape's edge.

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

- ## Nested Class Summary

  ## Nested classes/interfaces inherited from class org.apache.lucene.spatial.prefix.PrefixTreeStrategy

  `PrefixTreeStrategy.ShapeTokenStream`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected boolean`
  `multiOverlappingIndexedShapes`
  `protected int`
  `prefixGridScanLevel`
  `protected boolean`
  `pruneLeafyBranches`

  ### Fields inherited from class org.apache.lucene.spatial.prefix.PrefixTreeStrategy

  `defaultFieldValuesArrayLen, distErrPct, FIELD_TYPE, grid, pointsOnly`

  ### Fields inherited from class org.apache.lucene.spatial.SpatialStrategy

  `ctx`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `RecursivePrefixTreeStrategy(SpatialPrefixTree grid, String fieldName)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected Iterator<Cell>`
  `createCellIteratorToIndex(org.locationtech.spatial4j.shape.Shape shape, int detailLevel, Iterator<Cell> reuse)`
  `int`
  `getPrefixGridScanLevel()`
  `protected boolean`
  `isGridAlignedShape(org.locationtech.spatial4j.shape.Shape shape)`
  A quick check of the shape to see if it is perfectly aligned to a grid.
  `boolean`
  `isMultiOverlappingIndexedShapes()`
  `boolean`
  `isPruneLeafyBranches()`
  `protected Query`
  `makeGridShapeIntersectsQuery(org.locationtech.spatial4j.shape.Shape gridShape)`
  `makeQuery(SpatialArgs)` specialized for the query being a grid square.
  `Query`
  `makeQuery(SpatialArgs args)`
  Make a Query based principally on `SpatialOperation` and `Shape` from the supplied `args`.
  `void`
  `setMultiOverlappingIndexedShapes(boolean multiOverlappingIndexedShapes)`
  See `ContainsPrefixTreeQuery.multiOverlappingIndexedShapes`.
  `void`
  `setPrefixGridScanLevel(int prefixGridScanLevel)`
  Sets the grid level [1-maxLevels] at which indexed terms are scanned brute-force instead of by grid decomposition.
  `void`
  `setPruneLeafyBranches(boolean pruneLeafyBranches)`
  An optional hint affecting non-point shapes and tree cells implementing `CellCanPrune`, otherwise ignored.
  `String`
  `toString()`

  ### Methods inherited from class org.apache.lucene.spatial.prefix.PrefixTreeStrategy

  `calcFacets, createIndexableFields, createIndexableFields, createIndexableFields, getDistErrPct, getGrid, isPointShape, isPointsOnly, makeDistanceValueSource, newCellToBytesRefIterator, setDefaultFieldValuesArrayLen, setDistErrPct, setPointsOnly, tokenStream`

  ### Methods inherited from class org.apache.lucene.spatial.SpatialStrategy

  `getFieldName, getSpatialContext, makeDistanceValueSource, makeRecipDistanceValueSource`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- ## Field Details

  - ### prefixGridScanLevel

    protected int prefixGridScanLevel

  - ### pruneLeafyBranches

    protected boolean pruneLeafyBranches

  - ### multiOverlappingIndexedShapes

    protected boolean multiOverlappingIndexedShapes

- ## Constructor Details

  - ### RecursivePrefixTreeStrategy

    public RecursivePrefixTreeStrategy(SpatialPrefixTree grid, String fieldName)

- ## Method Details

  - ### getPrefixGridScanLevel

    public int getPrefixGridScanLevel()

  - ### setPrefixGridScanLevel

    public void setPrefixGridScanLevel(int prefixGridScanLevel)
    Sets the grid level [1-maxLevels] at which indexed terms are scanned brute-force instead of by grid decomposition. By default this is maxLevels - 4. The final level, maxLevels, is always scanned.
    Parameters:
      `prefixGridScanLevel` - 1 to maxLevels

  - ### isMultiOverlappingIndexedShapes

    public boolean isMultiOverlappingIndexedShapes()

  - ### setMultiOverlappingIndexedShapes

    public void setMultiOverlappingIndexedShapes(boolean multiOverlappingIndexedShapes)
    See `ContainsPrefixTreeQuery.multiOverlappingIndexedShapes`.

  - ### isPruneLeafyBranches

    public boolean isPruneLeafyBranches()

  - ### setPruneLeafyBranches

    public void setPruneLeafyBranches(boolean pruneLeafyBranches)
    An optional hint affecting non-point shapes and tree cells implementing `CellCanPrune`, otherwise ignored.

    It will prune away a complete set sibling leaves to their parent (recursively), resulting in ~20-50% fewer indexed cells, and consequently that much less disk and that much faster indexing. So if it's a quad tree and all 4 sub-cells are there marked as a leaf, then they will be removed (pruned) and the parent is marked as a leaf instead. This occurs recursively on up. Unfortunately, the current implementation will buffer all cells to do this, so consider disabling for high precision (low distErrPct) shapes. (default=true)

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `SpatialStrategy`

  - ### createCellIteratorToIndex

    protected Iterator<Cell> createCellIteratorToIndex(org.locationtech.spatial4j.shape.Shape shape, int detailLevel, Iterator<Cell> reuse)
    Overrides:
      `createCellIteratorToIndex` in class `PrefixTreeStrategy`

  - ### makeQuery

    public Query makeQuery(SpatialArgs args)
    Description copied from class: `SpatialStrategy`
    Make a Query based principally on `SpatialOperation` and `Shape` from the supplied `args`. It should be constant scoring of 1.
    Specified by:
      `makeQuery` in class `SpatialStrategy`

  - ### isGridAlignedShape

    protected boolean isGridAlignedShape(org.locationtech.spatial4j.shape.Shape shape)
    A quick check of the shape to see if it is perfectly aligned to a grid. Points always are as they are indivisible. It's okay to return false if the shape actually is aligned; this is an optimization hint.

  - ### makeGridShapeIntersectsQuery

    protected Query makeGridShapeIntersectsQuery(org.locationtech.spatial4j.shape.Shape gridShape)
    `makeQuery(SpatialArgs)` specialized for the query being a grid square.