<schema name="Brown University Digital Collections" version="1.2">
   <types>
      <!-- The StrField type is not analyzed, but indexed/stored verbatim, supports an optional compressThreshold -->
      <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

      <!-- boolean type: "true" or "false" -->
      <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>

      <!-- numeric field types that store and index the text value verbatim, and hence don't support range queries -->
      <fieldType name="integer" class="solr.IntField" omitNorms="true"/>
      <fieldType name="long" class="solr.LongField" omitNorms="true"/>
      <fieldType name="float" class="solr.FloatField" omitNorms="true"/>
      <fieldType name="double" class="solr.DoubleField" omitNorms="true"/>

      <!-- Numeric field types that manipulate the value into lexicographic ordering so that range queries work -->
      <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
      <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
      <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
      <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>

      <!-- The format for this date field is of the form 1995-12-31T23:59:59Z -->
      <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>

      <!-- A text field that only splits on whitespace for exact matching of words -->
      <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
         <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
         </analyzer>
      </fieldType>

      <!-- A text field that enables splitting and matching of words on case-change, alpha numeric boundaries, and non-alphanumeric chars.
           Synonyms and stopwords are customized by external files, and stemming is enabled.  
           Duplicate tokens at the same position are removed. 
      -->
      <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
         <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <!-- filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/ -->
            <!-- filter class="solr.StopFilterFactory" ignoreCase="true" words="OCLCstopwords.txt"/ -->
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <!-- filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/ -->
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
         </analyzer>
         <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <!-- filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/ -->
            <!-- filter class="solr.StopFilterFactory" ignoreCase="true" words="OCLCstopwords.txt"/ -->
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <!-- filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/ -->
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
         </analyzer>
      </fieldType>

      <!-- Less flexible matching, but less false matches - can insert dashes in the wrong place and still match -->
      <fieldType name="textTight" class="solr.TextField" positionIncrementGap="100">
         <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
         </analyzer>
      </fieldType>

      <!-- Uses the KeywordTokenizer along with various TokenFilterFactories to produce a sortable field -->
      <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
         <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.TrimFilterFactory"/>
            <filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z])" replacement="" replace="all"/>
         </analyzer>
      </fieldType>
   </types>

   <fields>
      <!-- identification -->
      <field name="objID"           type="string"        indexed="true" stored="true" multiValued="false"/>
      <field name="modsID"          type="string"        indexed="true" stored="true" multiValued="true"/>
      <field name="collectionID"    type="string"        indexed="true" stored="true" multiValued="false"/>
      <!-- types -->
      <field name="DCtype"          type="string"        indexed="true" stored="true" multiValued="true"/>
      <field name="AATtype"         type="string"        indexed="true" stored="true" multiValued="true"/>
      <!-- title -->
      <field name="title"           type="text"          indexed="true" stored="true" multiValued="true"/>
      <field name="subTitle"        type="text"          indexed="true" stored="true" multiValued="true"/>
      <field name="partNumber"      type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="partName"        type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="tableOfContents" type="text"          indexed="true" stored="true" multiValued="true"/>
      <!-- creator -->
      <field name="name"            type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="role"            type="text"	         indexed="true" stored="true" multiValued="true"/>
      <!-- abstract -->
      <field name="abstract"        type="text"	         indexed="true" stored="true" multiValued="true" compressed="true" compressThreshold="300"/>
      <field name="note"            type="text"	         indexed="true" stored="true" multiValued="true" compressed="true" compressThreshold="300"/>
      <field name="identifier"      type="text"	         indexed="true" stored="true" multiValued="true" compressed="true" compressThreshold="300"/>
      <!-- subject -->
      <field name="subject"         type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="genre"           type="text"	         indexed="true" stored="true" multiValued="true"/>
      <!-- publication -->
      <field name="pubPlace"        type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="pubPlaceCode"    type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="publisher"       type="text"	         indexed="true" stored="true" multiValued="true"/>
      <field name="dateBegin"       type="sint"	         indexed="true" stored="true" multiValued="true"/>
      <field name="dateEnd"         type="sint"	         indexed="true" stored="true" multiValued="true"/>
      <!--field name="date"            type="text"	         indexed="true" stored="true" multiValued="true"/-->
      <!-- cartographics -->
      <field name="cartographics"   type="text"	         indexed="true" stored="true" multiValued="true"/>
      <!-- catch all fields -->
      <field name="ti_all"          type="text"	         indexed="true" stored="false" multiValued="true"/> 
      <field name="ti_title"        type="text"          indexed="true" stored="false" multiValued="true"/> 
      <field name="ti_name"         type="text"	         indexed="true" stored="false" multiValued="true"/> 
      <field name="ti_note"         type="text"	         indexed="true" stored="false" multiValued="true"/> 
      <field name="ti_subject"      type="text"	         indexed="true" stored="false" multiValued="true"/> 
      <field name="ti_origin"       type="text"	         indexed="true" stored="false" multiValued="true"/> 
      <!-- dynamic fields -->
      <dynamicField name="*_str"    type="string"        indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_bool"   type="boolean"       indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_date"   type="date"          indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_int"    type="integer"       indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_lng"    type="long"          indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_flt"    type="float"         indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_dbl"    type="double"        indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_srt_i"  type="sint"          indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_srt_l"  type="slong"         indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_srt_f"  type="sfloat"        indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_srt_d"  type="sdouble"       indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_ws"     type="text_ws"       indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_txt"    type="text"          indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_tght"   type="textTight"     indexed="true" stored="true" multiValued="true"/>
      <dynamicField name="*_alpha"  type="alphaOnlySort" indexed="true" stored="true" multiValued="true"/>
   </fields>

   <uniqueKey>objID</uniqueKey>
   <defaultSearchField>ti_all</defaultSearchField>
   <solrQueryParser defaultOperator="OR"/>

   <!-- copy all -->
   <copyField source="modsID"			dest="ti_all"/>
   <copyField source="DCtype"			dest="ti_all"/>
   <copyField source="AATtype"			dest="ti_all"/>
   <copyField source="tableOfContents"		dest="ti_all"/>   
   <copyField source="title"			dest="ti_all"/>
   <copyField source="subTitle"     		dest="ti_all"/>
   <copyField source="partNumber"		dest="ti_all"/>
   <copyField source="partName"			dest="ti_all"/>
   <copyField source="name"			dest="ti_all"/>
   <copyField source="role"			dest="ti_all"/>
   <copyField source="abstract"			dest="ti_all"/>
   <copyField source="note"			dest="ti_all"/>
   <copyField source="identifier"		dest="ti_all"/>
   <copyField source="subject"			dest="ti_all"/>
   <copyField source="genre"			dest="ti_all"/>
   <copyField source="pubPlace"			dest="ti_all"/>
   <copyField source="pubPlaceCode"		dest="ti_all"/>
   <copyField source="publisher"		dest="ti_all"/>
   <copyField source="dateBegin"		dest="ti_all"/>
   <copyField source="dateEnd"			dest="ti_all"/>
   <!--copyField source="date"	      		dest="ti_all"/-->  
   <copyField source="cartographics"		dest="ti_all"/>

   <!-- copy ti_title -->
   <copyField source="tableOfContents"		dest="ti_title"/>
   <copyField source="title"			dest="ti_title"/>
   <copyField source="subTitle"	      		dest="ti_title"/>
   <copyField source="partNumber"		dest="ti_title"/>
   <copyField source="partName"			dest="ti_title"/>

   <!-- copy ti_name -->
   <copyField source="name"			dest="ti_name"/>
   <copyField source="role"			dest="ti_name"/>

   <!-- copy ti_note -->
   <copyField source="abstract"			dest="ti_note"/>
   <copyField source="note"			dest="ti_note"/>
   <copyField source="identifier"		dest="ti_note"/>

   <!-- copy ti_subject -->
   <copyField source="subject"			dest="ti_subject"/>
   <copyField source="genre"			dest="ti_subject"/>

   <!-- copy ti_origin -->
   <copyField source="pubPlace"			dest="ti_origin"/>
   <copyField source="pubPlaceCode"		dest="ti_origin"/>
   <copyField source="publisher"		dest="ti_origin"/>
   <copyField source="dateBegin"		dest="ti_origin"/>
   <copyField source="dateEnd"			dest="ti_origin"/>
   <!--copyField source="date"			dest="ti_origin"/-->
</schema>


