Class IndexSchema

java.lang.Object
org.apache.solr.schema.IndexSchema
Direct Known Subclasses:
ManagedIndexSchema

public class IndexSchema extends Object
IndexSchema contains information about the valid fields in an index and the types of those fields.
  • Field Details

  • Constructor Details

  • Method Details

    • getDynamicFields

      public IndexSchema.DynamicField[] getDynamicFields()
    • getCopyFieldsMap

      public Map<String,List<CopyField>> getCopyFieldsMap()
    • getDynamicCopyFields

      public IndexSchema.DynamicCopy[] getDynamicCopyFields()
    • getResourceLoader

      public SolrResourceLoader getResourceLoader()
      The resource loader to be used to load components related to the schema when the schema is loading / initialising. It should not be used for any other purpose or time; consider SolrCore.getResourceLoader() instead.
      Since:
      solr 1.4
    • getResourceName

      public String getResourceName()
      Gets the name of the resource used to instantiate this schema.
    • getSolrClassLoader

      public org.apache.solr.common.cloud.SolrClassLoader getSolrClassLoader()
    • setResourceName

      public void setResourceName(String resourceName)
      Sets the name of the resource used to instantiate this schema.
    • getSchemaName

      public String getSchemaName()
      Gets the name of the schema as specified in the schema resource.
    • getDefaultLuceneMatchVersion

      public org.apache.lucene.util.Version getDefaultLuceneMatchVersion()
      The Default Lucene Match Version for this IndexSchema
    • getVersion

      public float getVersion()
    • getFields

      public Map<String,SchemaField> getFields()
      Provides direct access to the Map containing all explicit (ie: non-dynamic) fields in the index, keyed on field name.

      Modifying this Map (or any item in it) will affect the real schema

      NOTE: this function is not thread safe. However, it is safe to use within the standard inform( SolrCore core ) function for SolrCoreAware classes. Outside inform, this could potentially throw a ConcurrentModificationException

    • getFieldTypes

      public Map<String,FieldType> getFieldTypes()
      Provides direct access to the Map containing all Field Types in the index, keyed on field type name.

      Modifying this Map (or any item in it) will affect the real schema. However if you make any modifications, be sure to call refreshAnalyzers() to update the Analyzers for the registered fields.

      NOTE: this function is not thread safe. However, it is safe to use within the standard inform( SolrCore core ) function for SolrCoreAware classes. Outside inform, this could potentially throw a ConcurrentModificationException

    • getFieldsWithDefaultValue

      public List<SchemaField> getFieldsWithDefaultValue()
      Provides direct access to the List containing all fields with a default value
    • getRequiredFields

      public Collection<SchemaField> getRequiredFields()
      Provides direct access to the List containing all required fields. This list contains all fields with default values.
    • getSimilarity

      public org.apache.lucene.search.similarities.Similarity getSimilarity()
      Returns the Similarity used for this index
    • getSimilarityFactory

      public SimilarityFactory getSimilarityFactory()
      Returns the SimilarityFactory that constructed the Similarity for this index
    • getIndexAnalyzer

      public org.apache.lucene.analysis.Analyzer getIndexAnalyzer()
      Returns the Analyzer used when indexing documents for this index

      This Analyzer is field (and dynamic field) name aware, and delegates to a field specific Analyzer based on the field type.

    • getQueryAnalyzer

      public org.apache.lucene.analysis.Analyzer getQueryAnalyzer()
      Returns the Analyzer used when searching this index

      This Analyzer is field (and dynamic field) name aware, and delegates to a field specific Analyzer based on the field type.

    • getUniqueKeyField

      public SchemaField getUniqueKeyField()
      Unique Key field specified in the schema file
      Returns:
      null if this schema has no unique key field
    • getUniqueKeyField

      public org.apache.lucene.index.IndexableField getUniqueKeyField(org.apache.lucene.document.Document doc)
      The raw (field type encoded) value of the Unique Key field for the specified Document
      Returns:
      null if this schema has no unique key field
      See Also:
    • printableUniqueKey

      public String printableUniqueKey(org.apache.lucene.document.Document doc)
      The printable value of the Unique Key field for the specified Document
      Returns:
      null if this schema has no unique key field
    • printableUniqueKey

      public String printableUniqueKey(org.apache.solr.common.SolrDocument solrDoc)
    • printableUniqueKey

      public String printableUniqueKey(org.apache.solr.common.SolrInputDocument solrDoc)
    • printableUniqueKey

      public String printableUniqueKey(org.apache.lucene.util.BytesRef idBytes)
      Given an indexable uniqueKey value, return the readable/printable version
    • indexableUniqueKey

      public org.apache.lucene.util.BytesRef indexableUniqueKey(String idStr)
      Given a readable/printable uniqueKey value, return an indexable version
    • refreshAnalyzers

      public void refreshAnalyzers()
      This will re-create the Analyzers. If you make any modifications to the Field map (getFields(), this function is required to synch the internally cached field analyzers.
      Since:
      solr 1.3
    • getUninversionMapper

      public Function<String,UninvertingReader.Type> getUninversionMapper()
      See Also:
    • isMutable

      public boolean isMutable()
    • readSchema

      protected void readSchema(ConfigSetService.ConfigResource is)
    • postReadInform

      protected void postReadInform()
    • loadFields

      protected Map<String,Boolean> loadFields(org.apache.solr.common.ConfigNode n)
      Loads fields and dynamic fields.
      Returns:
      a map from field name to explicit required value
    • dynamicFieldListToSortedArray

      protected static IndexSchema.DynamicField[] dynamicFieldListToSortedArray(List<IndexSchema.DynamicField> dynamicFieldList)
      Sort the dynamic fields and stuff them in a normal array for faster access.
    • loadCopyFields

      protected void loadCopyFields(org.apache.solr.common.ConfigNode n)
      Loads the copy fields
    • isValidFieldGlob

      protected static boolean isValidFieldGlob(String name)
      Returns true if the given name has exactly one asterisk either at the start or end of the name
    • isValidDynamicField

      protected boolean isValidDynamicField(List<IndexSchema.DynamicField> dFields, SchemaField f)
    • registerDynamicFields

      public void registerDynamicFields(SchemaField... fields)
      Register one or more new Dynamic Fields with the Schema.
      Parameters:
      fields - The sequence of SchemaField
    • isDuplicateDynField

      protected boolean isDuplicateDynField(List<IndexSchema.DynamicField> dFields, SchemaField f)
    • registerCopyField

      public void registerCopyField(String source, String dest)
    • registerCopyField

      public void registerCopyField(String source, String dest, int maxChars)
      NOTE: this function is not thread safe. However, it is safe to use within the standard inform( SolrCore core ) function for SolrCoreAware classes. Outside inform, this could potentially throw a ConcurrentModificationException
      See Also:
    • registerExplicitSrcAndDestFields

      protected void registerExplicitSrcAndDestFields(String source, int maxChars, SchemaField destSchemaField, SchemaField sourceSchemaField)
    • getDynamicFieldPrototypes

      public SchemaField[] getDynamicFieldPrototypes()
    • getDynamicPattern

      public String getDynamicPattern(String fieldName)
    • hasExplicitField

      public boolean hasExplicitField(String fieldName)
      Does the schema explicitly define the specified field, i.e. not as a result of a copyField declaration? We consider it explicitly defined if it matches a field name or a dynamicField name.
      Returns:
      true if explicitly declared in the schema.
    • isDynamicField

      public boolean isDynamicField(String fieldName)
      Is the specified field dynamic or not.
      Returns:
      true if the specified field is dynamic
    • getFieldOrNull

      public SchemaField getFieldOrNull(String fieldName)
      Returns the SchemaField that should be used for the specified field name, or null if none exists.
      Parameters:
      fieldName - may be an explicitly defined field or a name that matches a dynamic field.
      Returns:
      The SchemaField
      See Also:
    • getField

      public SchemaField getField(String fieldName)
      Returns the SchemaField that should be used for the specified field name
      Parameters:
      fieldName - may be an explicitly defined field or a name that matches a dynamic field.
      Returns:
      The SchemaField
      Throws:
      org.apache.solr.common.SolrException - if no such field exists
      See Also:
    • getFieldType

      public FieldType getFieldType(String fieldName)
      Returns the FieldType for the specified field name.

      This method exists because it can be more efficient then getField(java.lang.String) for dynamic fields if a full SchemaField isn't needed.

      Parameters:
      fieldName - may be an explicitly created field, or a name that excercises a dynamic field.
      Throws:
      org.apache.solr.common.SolrException - if no such field exists
      See Also:
    • getFieldTypeByName

      public FieldType getFieldTypeByName(String fieldTypeName)
      Given the name of a FieldType (not to be confused with getFieldType(String) which takes in the name of a field), return the FieldType.
      Parameters:
      fieldTypeName - The name of the FieldType
      Returns:
      The FieldType or null.
    • getFieldTypeNoEx

      public FieldType getFieldTypeNoEx(String fieldName)
      Returns the FieldType for the specified field name.

      This method exists because it can be more efficient then getField(java.lang.String) for dynamic fields if a full SchemaField isn't needed.

      Parameters:
      fieldName - may be an explicitly created field, or a name that exercises a dynamic field.
      Returns:
      null if field is not defined.
      See Also:
    • getDynamicFieldType

      public FieldType getDynamicFieldType(String fieldName)
      Returns the FieldType of the best matching dynamic field for the specified field name
      Parameters:
      fieldName - may be an explicitly created field, or a name that exercises a dynamic field.
      Throws:
      org.apache.solr.common.SolrException - if no such field exists
      See Also:
    • getCopySources

      public List<String> getCopySources(String destField)
      Get all copy fields, both the static and the dynamic ones.
      Returns:
      Array of fields copied into this field
    • getCopyFieldsList

      public List<CopyField> getCopyFieldsList(String sourceField)
      Get all copy fields for a specified source field, both static and dynamic ones.
      Returns:
      List of CopyFields to copy to.
      Since:
      solr 1.4
    • isCopyFieldTarget

      public boolean isCopyFieldTarget(SchemaField f)
      Check if a field is used as the destination of a copyField operation
      Since:
      solr 1.3
    • getNamedPropertyValues

      public Map<String,Object> getNamedPropertyValues()
      Get a map of property name -> value for the whole schema.
    • getNamedPropertyValues

      public Map<String,Object> getNamedPropertyValues(String name, org.apache.solr.common.params.SolrParams params)
    • getCopyFieldProperties

      public List<org.apache.solr.common.util.SimpleOrderedMap<Object>> getCopyFieldProperties(boolean showDetails, Set<String> requestedSourceFields, Set<String> requestedDestinationFields)
      Returns a list of copyField directives, with optional details and optionally restricting to those directives that contain the requested source and/or destination field names.
      Parameters:
      showDetails - If true, source and destination dynamic bases, and explicit fields matched by source globs, will be added to dynamic copyField directives where appropriate
      requestedSourceFields - If not null, output is restricted to those copyField directives with the requested source field names
      requestedDestinationFields - If not null, output is restricted to those copyField directives with the requested destination field names
      Returns:
      a list of copyField directives
    • addField

      public IndexSchema addField(SchemaField newField, boolean persist)
      Copies this schema, adds the given field to the copy Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      newField - the SchemaField to add
      persist - to persist the schema or not
      Returns:
      a new IndexSchema based on this schema with newField added
      See Also:
    • addField

      public IndexSchema addField(SchemaField newField)
    • addField

      public IndexSchema addField(SchemaField newField, Collection<String> copyFieldNames)
      Copies this schema, adds the given field to the copy Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      newField - the SchemaField to add
      copyFieldNames - 0 or more names of targets to copy this field to. The targets must already exist.
      Returns:
      a new IndexSchema based on this schema with newField added
      See Also:
    • addFields

      public IndexSchema addFields(Collection<SchemaField> newFields)
      Copies this schema, adds the given fields to the copy. Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      newFields - the SchemaFields to add
      Returns:
      a new IndexSchema based on this schema with newFields added
      See Also:
    • addFields

      public IndexSchema addFields(Collection<SchemaField> newFields, Map<String,Collection<String>> copyFieldNames, boolean persist)
      Copies this schema, adds the given fields to the copy Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      newFields - the SchemaFields to add
      copyFieldNames - 0 or more names of targets to copy this field to. The target fields must already exist.
      persist - Persist the schema or not
      Returns:
      a new IndexSchema based on this schema with newFields added
      See Also:
    • deleteFields

      public IndexSchema deleteFields(Collection<String> names)
      Copies this schema, deletes the named fields from the copy.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      names - the names of the fields to delete
      Returns:
      a new IndexSchema based on this schema with the named fields deleted
    • replaceField

      public IndexSchema replaceField(String fieldName, FieldType replacementFieldType, Map<String,?> replacementArgs)
      Copies this schema, deletes the named field from the copy, creates a new field with the same name using the given args, then rebinds any referring copy fields to the replacement field.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      fieldName - The name of the field to be replaced
      replacementFieldType - The field type of the replacement field
      replacementArgs - Initialization params for the replacement field
      Returns:
      a new IndexSchema based on this schema with the named field replaced
    • addDynamicFields

      public IndexSchema addDynamicFields(Collection<SchemaField> newDynamicFields, Map<String,Collection<String>> copyFieldNames, boolean persist)
      Copies this schema, adds the given dynamic fields to the copy, Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      newDynamicFields - the SchemaFields to add
      copyFieldNames - 0 or more names of targets to copy this field to. The target fields must already exist.
      persist - to persist the schema or not
      Returns:
      a new IndexSchema based on this schema with newDynamicFields added
      See Also:
    • deleteDynamicFields

      public IndexSchema deleteDynamicFields(Collection<String> fieldNamePatterns)
      Copies this schema, deletes the named dynamic fields from the copy.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      fieldNamePatterns - the names of the dynamic fields to delete
      Returns:
      a new IndexSchema based on this schema with the named dynamic fields deleted
    • replaceDynamicField

      public ManagedIndexSchema replaceDynamicField(String fieldNamePattern, FieldType replacementFieldType, Map<String,?> replacementArgs)
      Copies this schema, deletes the named dynamic field from the copy, creates a new dynamic field with the same field name pattern using the given args, then rebinds any referring dynamic copy fields to the replacement dynamic field.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      fieldNamePattern - The glob for the dynamic field to be replaced
      replacementFieldType - The field type of the replacement dynamic field
      replacementArgs - Initialization params for the replacement dynamic field
      Returns:
      a new IndexSchema based on this schema with the named dynamic field replaced
    • addCopyFields

      public IndexSchema addCopyFields(Map<String,Collection<String>> copyFields, boolean persist)
      Copies this schema and adds the new copy fields to the copy Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      copyFields - Key is the name of the source field name, value is a collection of target field names. Fields must exist.
      persist - to persist the schema or not
      Returns:
      The new Schema with the copy fields added
      See Also:
    • addCopyFields

      public IndexSchema addCopyFields(String source, Collection<String> destinations, int maxChars)
      Copies this schema and adds the new copy fields to the copy.

      Requires synchronizing on the object returned by getSchemaUpdateLock()

      Parameters:
      source - source field name
      destinations - collection of target field names
      maxChars - max number of characters to copy from the source to each of the destinations. Use CopyField.UNLIMITED if you don't want to limit the number of copied chars.
      Returns:
      The new Schema with the copy fields added
    • deleteCopyFields

      public IndexSchema deleteCopyFields(Map<String,Collection<String>> copyFields)
      Copies this schema and deletes the given copy fields from the copy.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      copyFields - Key is the name of the source field name, value is a collection of target field names. Each corresponding copy field directives must exist.
      Returns:
      The new Schema with the copy fields deleted
    • newField

      public SchemaField newField(String fieldName, String fieldType, Map<String,?> options)
      Returns a SchemaField if the given fieldName does not already exist in this schema, and does not match any dynamic fields in this schema. The resulting SchemaField can be used in a call to addField(SchemaField).
      Parameters:
      fieldName - the name of the field to add
      fieldType - the field type for the new field
      options - the options to use when creating the SchemaField
      Returns:
      The created SchemaField
      See Also:
    • newDynamicField

      public SchemaField newDynamicField(String fieldNamePattern, String fieldType, Map<String,?> options)
      Returns a SchemaField if the given dynamic field glob does not already exist in this schema, and does not match any dynamic fields in this schema. The resulting SchemaField can be used in a call to addField(SchemaField).
      Parameters:
      fieldNamePattern - the pattern for the dynamic field to add
      fieldType - the field type for the new field
      options - the options to use when creating the SchemaField
      Returns:
      The created SchemaField
      See Also:
    • getSchemaUpdateLock

      public Object getSchemaUpdateLock()
      Returns the schema update lock that should be synchronized on to update the schema. Only applicable to mutable schemas.
      Returns:
      the schema update lock object to synchronize on
    • addFieldTypes

      public IndexSchema addFieldTypes(List<FieldType> fieldTypeList, boolean persist)
      Copies this schema, adds the given field type to the copy, Requires synchronizing on the object returned by getSchemaUpdateLock().
      Parameters:
      fieldTypeList - a list of FieldTypes to add
      persist - to persist the schema or not
      Returns:
      a new IndexSchema based on this schema with the new types added
      See Also:
    • deleteFieldTypes

      public IndexSchema deleteFieldTypes(Collection<String> names)
      Copies this schema, deletes the named field types from the copy.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      names - the names of the field types to delete
      Returns:
      a new IndexSchema based on this schema with the named field types deleted
    • replaceFieldType

      public IndexSchema replaceFieldType(String typeName, String replacementClassName, Map<String,Object> replacementArgs)
      Copies this schema, deletes the named field type from the copy, creates a new field type with the same name using the given args, rebuilds fields and dynamic fields of the given type, then rebinds any referring copy fields to the rebuilt fields.

      The schema will not be persisted.

      Requires synchronizing on the object returned by getSchemaUpdateLock().

      Parameters:
      typeName - The name of the field type to be replaced
      replacementClassName - The class name of the replacement field type
      replacementArgs - Initialization params for the replacement field type
      Returns:
      a new IndexSchema based on this schema with the named field type replaced
    • newFieldType

      public FieldType newFieldType(String typeName, String className, Map<String,?> options)
      Returns a FieldType if the given typeName does not already exist in this schema. The resulting FieldType can be used in a call to addFieldTypes(java.util.List, boolean).
      Parameters:
      typeName - the name of the type to add
      className - the name of the FieldType class
      options - the options to use when creating the FieldType
      Returns:
      The created FieldType
      See Also:
    • isUsableForChildDocs

      public boolean isUsableForChildDocs()
      Helper method that returns true if the ROOT_FIELD_NAME uses the exact same 'type' as the getUniqueKeyField()
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • getPayloadDecoder

      public org.apache.lucene.queries.payloads.PayloadDecoder getPayloadDecoder(String field)