Class AbstractSpatialFieldType<T extends org.apache.lucene.spatial.SpatialStrategy>
- java.lang.Object
-
- org.apache.solr.schema.FieldProperties
-
- org.apache.solr.schema.FieldType
-
- org.apache.solr.schema.AbstractSpatialFieldType<T>
-
- 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 4SpatialStrategy
.- 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.solr.schema.FieldType
FieldType.DefaultAnalyzer, FieldType.MultiValueSelector
-
-
Field Summary
Fields Modifier and Type Field Description protected org.apache.lucene.spatial.query.SpatialArgsParser
argsParser
protected org.locationtech.spatial4j.context.SpatialContext
ctx
static String
DISTANCE
protected DistanceUnits
distanceUnits
static String
FILTER_PARAM
A local-param boolean that can be set to false to only return the FunctionQuery (score), and thus not do filtering.static String
FORMAT
Optional param to pick the string conversionstatic String
NONE
static String
RECIP_DISTANCE
static String
SCORE_PARAM
A local-param with one of "none" (default), "distance", "recipDistance" or supported values in (DistanceUnits.getSupportedUnits()
.protected org.locationtech.spatial4j.io.ShapeReader
shapeReader
protected org.locationtech.spatial4j.io.ShapeWriter
shapeWriter
protected Set<String>
supportedScoreModes
-
Fields inherited from class org.apache.solr.schema.FieldType
ANALYZER, args, AUTO_GENERATE_PHRASE_QUERIES, CHAR_FILTER, CHAR_FILTERS, CLASS_NAME, docValuesFormat, ENABLE_GRAPH_QUERIES, falseProperties, FILTER, FILTERS, INDEX, INDEX_ANALYZER, MULTI_TERM, MULTI_TERM_ANALYZER, POLY_FIELD_SEPARATOR, postingsFormat, properties, QUERY, QUERY_ANALYZER, similarity, SIMILARITY, similarityFactory, SYNONYM_QUERY_STYLE, TOKENIZER, trueProperties, TYPE, TYPE_NAME, typeName
-
Fields inherited from class org.apache.solr.schema.FieldProperties
BINARY, DOC_VALUES, INDEXED, LARGE_FIELD, MULTIVALUED, OMIT_NORMS, OMIT_POSITIONS, OMIT_TF_POSITIONS, REQUIRED, SORT_MISSING_FIRST, SORT_MISSING_LAST, STORE_OFFSETS, STORE_TERMOFFSETS, STORE_TERMPAYLOADS, STORE_TERMPOSITIONS, STORE_TERMVECTORS, STORED, TOKENIZED, UNINVERTIBLE, USE_DOCVALUES_AS_STORED
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractSpatialFieldType()
protected
AbstractSpatialFieldType(Set<String> moreScoreModes)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description org.apache.lucene.document.Field
createField(SchemaField field, Object val)
Used for adding a document when a field needs to be created from a type and a string.List<org.apache.lucene.index.IndexableField>
createFields(SchemaField field, Object val)
Given aSchemaField
, create one or moreIndexableField
instancesorg.apache.lucene.search.Query
createSpatialQuery(QParser parser, SpatialOptions options)
Implemented for compatibility with geofilt & bbox query parsers:SpatialQueryable
.DistanceUnits
getDistanceUnits()
org.apache.lucene.search.Query
getFieldQuery(QParser parser, SchemaField field, String externalVal)
Returns a Query instance for doing searches against a field.protected org.apache.lucene.search.Query
getQueryFromSpatialArgs(QParser parser, SchemaField field, org.apache.lucene.spatial.query.SpatialArgs spatialArgs)
org.apache.lucene.search.SortField
getSortField(SchemaField field, boolean top)
Returns the SortField instance that should be used to sort fields of this type.org.locationtech.spatial4j.context.SpatialContext
getSpatialContext()
protected org.apache.lucene.search.Query
getSpecializedExistenceQuery(QParser parser, SchemaField field)
Returns a Query instance for doing existence searches for a field without certain options, such as docValues or norms.protected org.apache.lucene.search.Query
getSpecializedRangeQuery(QParser parser, SchemaField field, String part1, String part2, boolean minInclusive, boolean maxInclusive)
Returns a Query instance for doing range searches on this field type.double
getSphereRadius()
protected String
getStoredValue(org.locationtech.spatial4j.shape.Shape shape, String shapeStr)
Called bycreateFields(SchemaField, Object)
to get the stored value.T
getStrategy(String fieldName)
Gets the cached strategy for this field, creating it if necessary vianewSpatialStrategy(String)
.Set<String>
getSupportedScoreModes()
The set of values supported for the score local-param.UninvertingReader.Type
getUninversionType(SchemaField sf)
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.org.apache.lucene.queries.function.ValueSource
getValueSource(SchemaField field, QParser parser)
called to get the default value source (normally, from the Lucene FieldCache.)protected org.apache.lucene.search.DoubleValuesSource
getValueSourceFromSpatialArgs(QParser parser, SchemaField field, org.apache.lucene.spatial.query.SpatialArgs spatialArgs, String score, T strategy)
protected void
init(IndexSchema schema, Map<String,String> args)
subclasses should initialize themselves with the args provided and remove valid arguments.boolean
isPolyField()
A "polyField" is a FieldType that can produce more than one IndexableField instance for a single value, via theFieldType.createFields(org.apache.solr.schema.SchemaField, Object)
method.protected org.apache.lucene.spatial.query.SpatialArgsParser
newSpatialArgsParser()
protected abstract T
newSpatialStrategy(String fieldName)
Called fromgetStrategy(String)
upon first use by fieldName.DistanceUnits
parseDistanceUnits(String str)
ifstr
is non-null, returnsDistanceUnits.valueOf(String)
(which will return null if not found), else returnsdistanceUnits
(only null before initialized ininit()
.org.locationtech.spatial4j.shape.Shape
parseShape(String str)
Create aShape
from the input stringprotected org.apache.lucene.spatial.query.SpatialArgs
parseSpatialArgs(QParser parser, String externalVal)
String
shapeToString(org.locationtech.spatial4j.shape.Shape shape)
Returns a String version of a shape to be used for the stored value.void
write(TextResponseWriter writer, String name, org.apache.lucene.index.IndexableField f)
calls back to TextResponseWriter to write the field value-
Methods inherited from class org.apache.solr.schema.FieldType
checkSchemaField, checkSupportsDocValues, createField, getAnalyzerProperties, getClassArg, getDefaultMultiValueSelectorForSort, getDocValuesFormat, getExistenceQuery, getFieldTermQuery, getIndexAnalyzer, getNamedPropertyValues, getNonFieldPropertyArgs, getNumberType, getNumericSort, getPostingsFormat, getPrefixQuery, getQueryAnalyzer, getRangeQuery, getRewriteMethod, getSetQuery, getSimilarity, getSimilarityFactory, getSingleValueSource, getSortedNumericSortField, getSortedSetSortField, getSortField, getStringSort, getTypeName, hasProperty, indexedToReadable, indexedToReadable, isExplicitAnalyzer, isExplicitQueryAnalyzer, isMultiValued, isPointField, isTokenized, isUtf8Field, marshalBase64SortValue, marshalSortValue, marshalStringSortValue, multiValuedFieldCache, readableToIndexed, readableToIndexed, restrictProps, setArgs, setIndexAnalyzer, setIsExplicitAnalyzer, setIsExplicitQueryAnalyzer, setQueryAnalyzer, setSimilarity, storedToIndexed, storedToReadable, supportsAnalyzers, toExternal, toInternal, toNativeType, toObject, toObject, toString, treatUnboundedRangeAsExistence, unmarshalBase64SortValue, unmarshalSortValue, unmarshalStringSortValue, useDocValuesAsStored, write
-
-
-
-
Field Detail
-
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:
- Constant Field Values
-
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:
- Constant Field Values
-
DISTANCE
public static final String DISTANCE
- See Also:
- Constant Field Values
-
RECIP_DISTANCE
public static final String RECIP_DISTANCE
- See Also:
- Constant Field Values
-
NONE
public static final String NONE
- See Also:
- Constant Field Values
-
FORMAT
public static final String FORMAT
Optional param to pick the string conversion- See Also:
- Constant Field Values
-
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
-
-
Method Detail
-
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.
-
parseDistanceUnits
public DistanceUnits parseDistanceUnits(String str)
ifstr
is non-null, returnsDistanceUnits.valueOf(String)
(which will return null if not found), else returnsdistanceUnits
(only null before initialized ininit()
.- 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 classFieldType
- See Also:
FieldType.toInternal(java.lang.String)
-
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 classFieldType
- Parameters:
sf
- field instance- Returns:
- type to uninvert, or
null
(to disallow uninversion for the field) - See Also:
SchemaField.isUninvertible()
-
createFields
public List<org.apache.lucene.index.IndexableField> createFields(SchemaField field, Object val)
Description copied from class:FieldType
Given aSchemaField
, create one or moreIndexableField
instances- Overrides:
createFields
in classFieldType
- Parameters:
field
- theSchemaField
val
- The value to add to the field- Returns:
- An array of
IndexableField
- See Also:
FieldType.createField(SchemaField, Object)
,FieldType.isPolyField()
-
getStoredValue
protected String getStoredValue(org.locationtech.spatial4j.shape.Shape shape, String shapeStr)
Called bycreateFields(SchemaField, Object)
to get the stored value.
-
parseShape
public org.locationtech.spatial4j.shape.Shape parseShape(String str)
Create aShape
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 fromgetStrategy(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 theFieldType.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 classFieldType
- 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 interfaceSpatialQueryable
-
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 passespart1
andpart2
as null if they are '*' respectively.minInclusive
andmaxInclusive
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/orpart2
as well as unequalminInclusive
andmaxInclusive
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 classFieldType
- Parameters:
parser
- theQParser
calling the methodfield
- the schema fieldpart1
- the lower boundary of the range, nulls are allowed.part2
- the upper boundary of the range, nulls are allowedminInclusive
- whether the minimum of the range is inclusive or notmaxInclusive
- 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 classFieldType
-
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 classFieldType
- Parameters:
parser
- TheQParser
calling the methodfield
- TheSchemaField
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 classFieldType
- Parameters:
parser
- TheQParser
calling the methodfield
- TheSchemaField
of the field to searchexternalVal
- The String representation of the value to search- Returns:
- The
Query
instance. This implementation returns aTermQuery
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 interfaceSpatialQueryable
-
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 vianewSpatialStrategy(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 valueSub-classes should prefer using
FieldType.toExternal(IndexableField)
orFieldType.toObject(IndexableField)
to get the writeable external value off
instead of directly usingf.stringValue()
orf.binaryValue()
- Specified by:
write
in classFieldType
- 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.
-
getDistanceUnits
public DistanceUnits getDistanceUnits()
-
-