Class AbstractSpatialFieldType<T extends org.apache.lucene.spatial.SpatialStrategy>

All Implemented Interfaces:
SpatialQueryable
Direct Known Subclasses:
AbstractSpatialPrefixTreeFieldType, BBoxField, LatLonPointSpatialField, RptWithGeometrySpatialField

public abstract class AbstractSpatialFieldType<T extends org.apache.lucene.spatial.SpatialStrategy> extends FieldType implements SpatialQueryable
Abstract base class for Solr FieldTypes based on a Lucene 4 SpatialStrategy.
WARNING: This API is experimental and might change in incompatible ways in the next release.
  • Field Details

    • SCORE_PARAM

      public static final String SCORE_PARAM
      A local-param with one of "none" (default), "distance", "recipDistance" or supported values in (DistanceUnits.getSupportedUnits().
      See Also:
    • FILTER_PARAM

      public static final String FILTER_PARAM
      A local-param boolean that can be set to false to only return the FunctionQuery (score), and thus not do filtering.
      See Also:
    • DISTANCE

      public static final String DISTANCE
      See Also:
    • RECIP_DISTANCE

      public static final String RECIP_DISTANCE
      See Also:
    • NONE

      public static final String NONE
      See Also:
    • FORMAT

      public static final String FORMAT
      Optional param to pick the string conversion
      See Also:
    • ctx

      protected org.locationtech.spatial4j.context.SpatialContext ctx
    • argsParser

      protected org.apache.lucene.spatial.query.SpatialArgsParser argsParser
    • shapeWriter

      protected org.locationtech.spatial4j.io.ShapeWriter shapeWriter
    • shapeReader

      protected org.locationtech.spatial4j.io.ShapeReader shapeReader
    • distanceUnits

      protected DistanceUnits distanceUnits
    • supportedScoreModes

      protected final Set<String> supportedScoreModes
  • Constructor Details

    • AbstractSpatialFieldType

      protected AbstractSpatialFieldType()
    • AbstractSpatialFieldType

      protected AbstractSpatialFieldType(Set<String> moreScoreModes)
  • Method Details

    • init

      protected void init(IndexSchema schema, Map<String,String> args)
      Description copied from class: FieldType
      subclasses should initialize themselves with the args provided and remove valid arguments. leftover arguments will cause an exception. Common boolean properties have already been handled.
      Overrides:
      init in class FieldType
    • parseDistanceUnits

      public DistanceUnits parseDistanceUnits(String str)
      if str is non-null, returns DistanceUnits.valueOf(String) (which will return null if not found), else returns distanceUnits (only null before initialized in init().
      Parameters:
      str - maybe null
      Returns:
      maybe null
    • newSpatialArgsParser

      protected org.apache.lucene.spatial.query.SpatialArgsParser newSpatialArgsParser()
    • createField

      public final org.apache.lucene.document.Field createField(SchemaField field, Object val)
      Description copied from class: FieldType
      Used for adding a document when a field needs to be created from a type and a string.

      By default, the indexed value is the same as the stored value (taken from toInternal()). Having a different representation for external, internal, and indexed would present quite a few problems given the current Lucene architecture. An analyzer for adding docs would need to translate internal->indexed while an analyzer for querying would need to translate external->indexed.

      The only other alternative to having internal==indexed would be to have internal==external. In this case, toInternal should convert to the indexed representation, toExternal() should do nothing, and createField() should *not* call toInternal, but use the external value and set tokenized=true to get Lucene to convert to the internal(indexed) form. :TODO: clean up and clarify this explanation.

      Overrides:
      createField in class FieldType
      See Also:
    • getUninversionType

      public UninvertingReader.Type getUninversionType(SchemaField sf)
      Description copied from class: FieldType
      If DocValues is not enabled for a field, but it's indexed, docvalues can be constructed on the fly (uninverted, aka fieldcache) on the first request to sort, facet, etc. This specifies the structure to use.

      This method will not be used if the field is (effectively) uninvertible="false"

      Specified by:
      getUninversionType in class FieldType
      Parameters:
      sf - field instance
      Returns:
      type to uninvert, or null (to disallow uninversion for the field)
      See Also:
    • createFields

      public List<org.apache.lucene.index.IndexableField> createFields(SchemaField field, Object val)
      Description copied from class: FieldType
      Given a SchemaField, create one or more IndexableField instances
      Overrides:
      createFields in class FieldType
      Parameters:
      field - the SchemaField
      val - The value to add to the field
      Returns:
      An array of IndexableField
      See Also:
    • getStoredValue

      protected String getStoredValue(org.locationtech.spatial4j.shape.Shape shape, String shapeStr)
      Called by createFields(SchemaField, Object) to get the stored value.
    • parseShape

      public org.locationtech.spatial4j.shape.Shape parseShape(String str)
      Create a Shape from the input string
    • shapeToString

      public String shapeToString(org.locationtech.spatial4j.shape.Shape shape)
      Returns a String version of a shape to be used for the stored value.

      The format can be selected using the initParam format={WKT|GeoJSON}

    • newSpatialStrategy

      protected abstract T newSpatialStrategy(String fieldName)
      Called from getStrategy(String) upon first use by fieldName. }
    • isPolyField

      public final boolean isPolyField()
      Description copied from class: FieldType
      A "polyField" is a FieldType that can produce more than one IndexableField instance for a single value, via the FieldType.createFields(org.apache.solr.schema.SchemaField, Object) method. This is useful when hiding the implementation details of a field from the Solr end user. For instance, a spatial point may be represented by multiple different fields.
      Overrides:
      isPolyField in class FieldType
      Returns:
      true if the FieldType.createFields(org.apache.solr.schema.SchemaField, Object) method may return more than one field
    • createSpatialQuery

      public org.apache.lucene.search.Query createSpatialQuery(QParser parser, SpatialOptions options)
      Implemented for compatibility with geofilt & bbox query parsers: SpatialQueryable.
      Specified by:
      createSpatialQuery in interface SpatialQueryable
    • getSpecializedRangeQuery

      protected org.apache.lucene.search.Query getSpecializedRangeQuery(QParser parser, SchemaField field, String part1, String part2, boolean minInclusive, boolean maxInclusive)
      Description copied from class: FieldType
      Returns a Query instance for doing range searches on this field type. SolrQueryParser currently passes part1 and part2 as null if they are '*' respectively. minInclusive and maxInclusive are both true currently by SolrQueryParser but that may change in the future. Also, other QueryParser implementations may have different semantics.

      Sub-classes should override this method to provide their own range query implementation. They should strive to handle nulls in part1 and/or part2 as well as unequal minInclusive and maxInclusive parameters gracefully.

      This method does not, and should not, check for or handle existence queries, please look at FieldType.getRangeQuery(org.apache.solr.search.QParser, org.apache.solr.schema.SchemaField, java.lang.String, java.lang.String, boolean, boolean) for that logic.

      Overrides:
      getSpecializedRangeQuery in class FieldType
      Parameters:
      parser - the QParser calling the method
      field - the schema field
      part1 - the lower boundary of the range, nulls are allowed.
      part2 - the upper boundary of the range, nulls are allowed
      minInclusive - whether the minimum of the range is inclusive or not
      maxInclusive - whether the maximum of the range is inclusive or not
      Returns:
      a Query instance to perform range search according to given parameters
    • getValueSource

      public org.apache.lucene.queries.function.ValueSource getValueSource(SchemaField field, QParser parser)
      Description copied from class: FieldType
      called to get the default value source (normally, from the Lucene FieldCache.)
      Overrides:
      getValueSource in class FieldType
    • getSpecializedExistenceQuery

      protected org.apache.lucene.search.Query getSpecializedExistenceQuery(QParser parser, SchemaField field)
      Description copied from class: FieldType
      Returns a Query instance for doing existence searches for a field without certain options, such as docValues or norms.

      This method can be overridden to implement specialized existence logic for fieldTypes. The default query returned is an unbounded range query.

      Overrides:
      getSpecializedExistenceQuery in class FieldType
      Parameters:
      parser - The QParser calling the method
      field - The SchemaField of the field to search
      Returns:
      The Query instance.
    • getFieldQuery

      public org.apache.lucene.search.Query getFieldQuery(QParser parser, SchemaField field, String externalVal)
      Description copied from class: FieldType
      Returns a Query instance for doing searches against a field.
      Overrides:
      getFieldQuery in class FieldType
      Parameters:
      parser - The QParser calling the method
      field - The SchemaField of the field to search
      externalVal - The String representation of the value to search
      Returns:
      The Query instance. This implementation returns a TermQuery but overriding queries may not
    • parseSpatialArgs

      protected org.apache.lucene.spatial.query.SpatialArgs parseSpatialArgs(QParser parser, String externalVal)
    • getQueryFromSpatialArgs

      protected org.apache.lucene.search.Query getQueryFromSpatialArgs(QParser parser, SchemaField field, org.apache.lucene.spatial.query.SpatialArgs spatialArgs)
    • getSphereRadius

      public double getSphereRadius()
      Specified by:
      getSphereRadius in interface SpatialQueryable
    • getSupportedScoreModes

      public Set<String> getSupportedScoreModes()
      The set of values supported for the score local-param. Not null.
    • getValueSourceFromSpatialArgs

      protected org.apache.lucene.search.DoubleValuesSource getValueSourceFromSpatialArgs(QParser parser, SchemaField field, org.apache.lucene.spatial.query.SpatialArgs spatialArgs, String score, T strategy)
    • getStrategy

      public T getStrategy(String fieldName)
      Gets the cached strategy for this field, creating it if necessary via newSpatialStrategy(String).
      Parameters:
      fieldName - Mandatory reference to the field name
      Returns:
      Non-null.
    • getSpatialContext

      public org.locationtech.spatial4j.context.SpatialContext getSpatialContext()
      Returns:
      The Spatial Context for this field type
    • write

      public void write(TextResponseWriter writer, String name, org.apache.lucene.index.IndexableField f) throws IOException
      Description copied from class: FieldType
      calls back to TextResponseWriter to write the field value

      Sub-classes should prefer using FieldType.toExternal(IndexableField) or FieldType.toObject(IndexableField) to get the writeable external value of f instead of directly using f.stringValue() or f.binaryValue()

      Specified by:
      write in class FieldType
      Throws:
      IOException
    • getSortField

      public org.apache.lucene.search.SortField getSortField(SchemaField field, boolean top)
      Description copied from class: FieldType
      Returns the SortField instance that should be used to sort fields of this type.
      Specified by:
      getSortField in class FieldType
      See Also:
    • getDistanceUnits

      public DistanceUnits getDistanceUnits()