An abstract SpatialStrategy based on
Lucene.Net.Spatial.Prefix.Tree.SpatialPrefixTree . The two subclasses are
RecursivePrefixTreeStrategy and
TermQueryPrefixTreeStrategy . This strategy is most effective as a fast approximate spatial search filter.
Characteristics:
- Can index any shape; however only RecursivePrefixTreeStrategy can effectively search non-point shapes.
- Can index a variable number of shapes per field value. This strategy can do it via multiple calls to CreateIndexableFields(Shape) for a document or by giving it some sort of Shape aggregate (e.g. JTS WKT MultiPoint). The shape's boundary is approximated to a grid precision.
- Can query with any shape. The shape's boundary is approximated to a grid precision.
- Only Lucene.Net.Spatial.Query.SpatialOperation.Intersects is supported. If only points are indexed then this is effectively equivalent to IsWithin.
- The strategy supports MakeDistanceValueSource(Point) even for multi-valued data, so long as the indexed data is all points; the behavior is undefined otherwise. However, it will likely be removed in the future in lieu of using another strategy with a more scalable implementation. Use of this call is the only circumstance in which a cache is used. The cache is simple but as such it doesn't scale to large numbers of points nor is it real-time-search friendly.
Implementation:
The
Lucene.Net.Spatial.Prefix.Tree.SpatialPrefixTree does most of the work, for example returning a list of terms representing grids of various sizes for a supplied shape. An important configuration item is
SetDistErrPct(double) which balances shape precision against scalability. See those javadocs.