ucsdlib/damspas

View on GitHub
solr_config/config/schema.xml

Summary

Maintainability
Test Coverage
<?xml version="1.0" encoding="UTF-8"?>
<schema name="Hydra" version="1.5">
  <!-- NOTE: various comments and unused configuration possibilities have been purged
     from this file.  Please refer to http://wiki.apache.org/solr/SchemaXml,
     as well as the default schema file included with Solr -->
  
  <uniqueKey>id</uniqueKey>
  
  <fields>
    <field name="id" type="string" stored="true" indexed="true" multiValued="false" required="true"/>
    <field name="id_t" type="string" stored="true" indexed="true" multiValued="false" required="true"/>
    <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
    
    <field name="lat" type="tdouble" stored="true" indexed="true" multiValued="false"/>
    <field name="lng" type="tdouble" stored="true" indexed="true" multiValued="false"/>

    <!--these fields are hard coded in places in hydra-head -->
    <field name="active_fedora_model_s" type="string" stored="true" indexed="true"/>
    <field name="object_profile_display" type="string" stored="true" indexed="true"/>
    <field name="has_model_s" type="string" stored="true" indexed="true"/>
    <field name="is_governed_by_s" type="string" stored="true" indexed="true"/>

    <!-- explicit fulltext field to suppress storing and returning (sometimes very large) fulltext -->
    <field name="fulltext_tesim" type="text_en" stored="false" indexed="true" multiValued="true"/>

    <!-- explicit rdfxml field (could be large)-->
    <field name="rdfxml_ssi" type="text_en" stored="true" indexed="false" multiValued="false"/>

    <!--
    These are hard coded in places in hydra-head, but we hope to fix that.
    
    <field name="inheritable_discover_access_person_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="inheritable_read_access_person_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="inheritable_edit_access_person_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="inheritable_discover_access_group_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="inheritable_read_access_group_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="inheritable_edit_access_group_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="read_access_person_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="discover_access_person_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="edit_access_person_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="read_access_group_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="edit_access_group_t" type="string" stored="true" indexed="true" multiValued="true"/>
    <field name="discover_access_group_t" type="string" stored="true" indexed="true" multiValued="true"/>
    -->    


    <!-- NOTE:  not all possible Solr field types are represented in the dynamic fields -->

    <!-- text (_t...) -->
    <dynamicField name="*_ti" type="text" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_tim" type="text" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_ts" type="text" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_tsm" type="text" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_tsi" type="text" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_tsim" type="text" stored="true" indexed="true" multiValued="true"/>
    <dynamicField name="*_tiv" type="text" stored="false" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
    <dynamicField name="*_timv" type="text" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
    <dynamicField name="*_tsiv" type="text" stored="true" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
    <dynamicField name="*_tsimv" type="text" stored="true" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
    
    <!-- English text (_te...) -->
    <dynamicField name="*_tei" type="text_en" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_teim" type="text_en" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_tes" type="text_en" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_tesm" type="text_en" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_tesi" type="text_en" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_tesim" type="text_en" stored="true" indexed="true" multiValued="true"/>
    <dynamicField name="*_teiv" type="text_en" stored="false" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
    <dynamicField name="*_teimv" type="text_en" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
    <dynamicField name="*_tesiv" type="text_en" stored="true" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
    <dynamicField name="*_tesimv" type="text_en" stored="true" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
    
    <!-- string (_s...) -->
    <dynamicField name="*_si" type="string" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_sim" type="string" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_ss" type="string" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_ssm" type="string" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_ssi" type="string" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_ssim" type="string" stored="true" indexed="true" multiValued="true"/>
    <dynamicField name="*_ssort" type="alphaSort" stored="false" indexed="true" multiValued="false"/>
    
    <!-- integer (_i...) -->
    <dynamicField name="*_ii" type="int" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_iim" type="int" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_is" type="int" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_ism" type="int" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_isi" type="int" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_isim" type="int" stored="true" indexed="true" multiValued="true"/>
    
    <!-- trie integer (_it...) (for faster range queries) -->
    <dynamicField name="*_iti" type="tint" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_itim" type="tint" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_its" type="tint" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_itsm" type="tint" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_itsi" type="tint" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_itsim" type="tint" stored="true" indexed="true" multiValued="true"/>
    
    <!-- date (_dt...) -->
    <!-- The format for this date field is of the form 1995-12-31T23:59:59Z
         Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z -->
    <dynamicField name="*_dti" type="date" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_dtim" type="date" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_dts" type="date" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_dtsm" type="date" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_dtsi" type="date" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_dtsim" type="date" stored="true" indexed="true" multiValued="true"/>
    
    <!-- trie date (_dtt...) (for faster range queries) -->
    <dynamicField name="*_dtti" type="tdate" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_dttim" type="tdate" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_dtts" type="tdate" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_dttsm" type="tdate" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_dttsi" type="tdate" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_dttsim" type="tdate" stored="true" indexed="true" multiValued="true"/>
    
    <!-- long (_l...) -->
    <dynamicField name="*_li" type="long" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_lim" type="long" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_ls" type="long" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_lsm" type="long" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_lsi" type="long" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_lsim" type="long" stored="true" indexed="true" multiValued="true"/>
    
    <!-- trie long (_lt...) (for faster range queries) -->
    <dynamicField name="*_lti" type="tlong" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_ltim" type="tlong" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_lts" type="tlong" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_ltsm" type="tlong" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_ltsi" type="tlong" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_ltsim" type="tlong" stored="true" indexed="true" multiValued="true"/>
    
    <!-- double (_db...) -->
    <dynamicField name="*_dbi" type="double" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_dbim" type="double" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_dbs" type="double" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_dbsm" type="double" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_dbsi" type="double" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_dbsim" type="double" stored="true" indexed="true" multiValued="true"/>
    
    <!-- trie double (_dbt...) (for faster range queries) -->
    <dynamicField name="*_dbti" type="tdouble" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_dbtim" type="tdouble" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_dbts" type="tdouble" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_dbtsm" type="tdouble" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_dbtsi" type="tdouble" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_dbtsim" type="tdouble" stored="true" indexed="true" multiValued="true"/>
    
    <!-- float (_f...) -->
    <dynamicField name="*_fi" type="float" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_fim" type="float" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_fs" type="float" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_fsm" type="float" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_fsi" type="float" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_fsim" type="float" stored="true" indexed="true" multiValued="true"/>
    
    <!-- trie float (_ft...) (for faster range queries) -->
    <dynamicField name="*_fti" type="tfloat" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_ftim" type="tfloat" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_fts" type="tfloat" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_ftsm" type="tfloat" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_ftsi" type="tfloat" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_ftsim" type="tfloat" stored="true" indexed="true" multiValued="true"/>
    
    <!-- boolean (_b...) -->
    <dynamicField name="*_bi" type="boolean" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_bs" type="boolean" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_bsi" type="boolean" stored="true" indexed="true" multiValued="false"/>
    
    <!-- Type used to index the lat and lon components for the "location" FieldType -->
    <dynamicField name="*_coordinate" type="tdouble" indexed="true"  stored="false" />

    <!-- location (_ll...) -->
    <dynamicField name="*_lli" type="location" stored="false" indexed="true" multiValued="false"/>
    <dynamicField name="*_llim" type="location" stored="false" indexed="true" multiValued="true"/>
    <dynamicField name="*_lls" type="location" stored="true" indexed="false" multiValued="false"/>
    <dynamicField name="*_llsm" type="location" stored="true" indexed="false" multiValued="true"/>
    <dynamicField name="*_llsi" type="location" stored="true" indexed="true" multiValued="false"/>
    <dynamicField name="*_llsim" type="location" stored="true" indexed="true" multiValued="true"/>

    <!-- you must define copyField source and dest fields explicity or schemaBrowser doesn't work -->
    <field name="all_text_timv" type="text" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>

    <!-- deprecated fields from pre-Solr 4.0 pre-hydra 5.0 -->
<!--    
    <field name="marc_display" type="string" indexed="false" stored="true" multiValued="false"/>
    <field name="title_display" type="string" indexed="false" stored="true" multiValued="false"/>
    <field name="title_vern_display" type="string" indexed="false" stored="true" multiValued="false"/>
    <field name="subtitle_display" type="string" indexed="false" stored="true" multiValued="false"/>
    <field name="subtitle_vern_display" type="string" indexed="false" stored="true" multiValued="false"/>
    <field name="author_display" type="string" indexed="false" stored="true" multiValued="false"/>
    <field name="author_vern_display" type="string" indexed="false" stored="true" multiValued="false"/>
-->
    <!-- these fields are also used for display, so they must be stored -->
<!--    
    <field name="isbn_t" type="text" indexed="true" stored="true" multiValued="true"/>
    <field name="language_facet" type="string" indexed="true" stored="true" multiValued="true" />
    <field name="subject_topic_facet" type="string" indexed="true" stored="true" multiValued="true" />
    <field name="subject_era_facet" type="string" indexed="true" stored="true" multiValued="true" />
    <field name="subject_geo_facet" type="string" indexed="true" stored="true" multiValued="true" />
-->
     <!-- pub_date is used for facet and display so it must be indexed and stored -->
<!--    
    <field name="pub_date" type="string" indexed="true" stored="true" multiValued="true"/>
-->
    <!-- pub_date sort uses new trie-based int fields, which are recommended for any int and are displayable, sortable, and range-quer
    we use 'tint' for faster range-queries. -->
<!--    
    <field name="pub_date_sort" type="tint" indexed="true" stored="true" multiValued="false"/>
-->
    <!-- format is used for facet, display, and choosing which partial to use for the show view, so it must be stored and indexed -->
<!--    
    <field name="format" type="string" indexed="true" stored="true"/>

    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text"    indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_txt" type="text_general"    indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>

    <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
    <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

    <dynamicField name="random_*" type="random" />

    <dynamicField name="*_display" type="string" indexed="false" stored="true" multiValued="true" />
    <dynamicField name="*_facet" type="string" indexed="true" stored="true" multiValued="true" />
    <dynamicField name="*_sort" type="string" indexed="true" stored="false" multiValued="false" />
    <dynamicField name="*_unstem_search" type="text_general" indexed="true" stored="false" multiValued="true" />
-->
    <!-- uncomment the following to ignore any fields that don't already match an existing
         field name or dynamic field, rather than reporting them as an error.
         alternately, change the type="ignored" to some other type e.g. "text" if you want
         unknown fields indexed and/or stored by default -->
    <!--dynamicField name="*" type="ignored" multiValued="true" /-->

    <!-- END hydra deprecated items -->

    <field name="exact_m" type="exactSearch_m" indexed="true" stored="false" multiValued="true"/>

  </fields>

  <!-- START hydra deprecated items -->
<!--  
  <defaultSearchField>text</defaultSearchField>
-->
  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
<!--  
  <solrQueryParser defaultOperator="AND"/>

  <copyField source="title_t" dest="title_unstem_search"/>
  <copyField source="subtitle_t" dest="subtitle_unstem_search"/>
  <copyField source="title_addl_t" dest="title_addl_unstem_search"/>
  <copyField source="title_added_entry_t" dest="title_added_entry_unstem_search"/>
  <copyField source="title_series_t" dest="title_series_unstem_search"/>
  <copyField source="author_t" dest="author_unstem_search"/>
  <copyField source="author_addl_t" dest="author_addl_unstem_search"/>
  <copyField source="subject_t" dest="subject_unstem_search"/>
  <copyField source="subject_addl_t" dest="subject_addl_unstem_search"/>
  <copyField source="subject_topic_facet" dest="subject_topic_unstem_search"/>
-->
  <!-- sort fields -->
<!--  
  <copyField source="pub_date" dest="pub_date_sort"/>
-->

    <copyField source="all_fields_tesim" dest="exact_m"/>
    <copyField source="fulltext_tesim" dest="exact_m"/>

  <!-- spellcheck fields -->
  <!-- default spell check;  should match fields for default request handler -->
  <!-- it won't work with a copy of a copy field -->
<!-- 
  <copyField source="*_t" dest="spell"/>
  <copyField source="*_facet" dest="spell"/>
-->
  <!-- title spell check;  should match fields for title request handler -->
<!-- 
  <copyField source="title_t" dest="title_spell"/>
  <copyField source="subtitle_t" dest="title_spell"/>
  <copyField source="addl_titles_t" dest="title_spell"/>
  <copyField source="title_added_entry_t" dest="title_spell"/>
  <copyField source="title_series_t" dest="title_spell"/>
-->
  <!-- author spell check; should match fields for author request handler -->
<!-- 
  <copyField source="author_t" dest="author_spell"/>
  <copyField source="author_addl_t" dest="author_spell"/>
-->
  <!-- subject spell check; should match fields for subject request handler -->
<!-- 
  <copyField source="subject_topic_facet" dest="subject_spell"/>
  <copyField source="subject_t" dest="subject_spell"/>
  <copyField source="subject_addl_t" dest="subject_spell"/>
-->
  
  <!-- OpenSearch query field should match request handler search fields -->
<!--  
  <copyField source="title_t" dest="opensearch_display"/>
  <copyField source="subtitle_t" dest="opensearch_display"/>
  <copyField source="addl_titles_t" dest="opensearch_display"/>
  <copyField source="title_added_entry_t" dest="opensearch_display"/>
  <copyField source="title_series_t" dest="opensearch_display"/>
  <copyField source="author_t" dest="opensearch_display"/>
  <copyField source="author_addl_t" dest="opensearch_display"/>
  <copyField source="subject_topic_facet" dest="opensearch_display"/>
  <copyField source="subject_t" dest="opensearch_display"/>
  <copyField source="subject_addl_t" dest="opensearch_display"/>
-->

  <!-- Above, multiple source fields are copied to the [text] field.
      Another way to map multiple source fields to the same
      destination field is to use the dynamic field syntax.
      copyField also supports a maxChars to copy setting.  -->

    <!-- <copyField source="*_t" dest="text" maxChars="3000"/> -->
<!--  
    <copyField source="*_s" dest="text"/>
    <copyField source="*_t" dest="text"/>
    <copyField source="*_facet" dest="text"/>
-->
    <!-- copy name to alphaNameSort, a field designed for sorting by name -->
    <!-- <copyField source="name" dest="alphaNameSort"/> -->

    <!-- END hydra deprecated items -->

  <!-- copy fields;  note that you must define copyField source and dest fields explicity or schemaBrowser doesn't work -->
<!--
  <copyField source="some_field" dest="all_text_timv" />
-->  

  <types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>    
    <fieldType name="rand" class="solr.RandomSortField" omitNorms="true"/>
    
    <!-- Default numeric field types.  -->
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
    
    <!-- trie numeric field types for faster range queries -->
    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
    
    <!-- The format for this date field is of the form 1995-12-31T23:59:59Z
         Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
      -->
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    <!-- A Trie based date field for faster date range queries and date faceting. -->
    <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
    
    
    <!-- This point type indexes the coordinates as separate fields (subFields)
      If subFieldType is defined, it references a type, and a dynamic field
      definition is created matching *___<typename>.  Alternately, if 
      subFieldSuffix is defined, that is used to create the subFields.
      Example: if subFieldType="double", then the coordinates would be
        indexed in fields myloc_0___double,myloc_1___double.
      Example: if subFieldSuffix="_d" then the coordinates would be indexed
        in fields myloc_0_d,myloc_1_d
      The subFields are an implementation detail of the fieldType, and end
      users normally should not need to know about them.
     -->
    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
    
    <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
    
    <!-- An alternative geospatial field type new to Solr 4.  It supports multiValued and polygon shapes.
      For more information about this and other Spatial fields new to Solr 4, see:
      http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
    -->
    <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
      geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees" />
    
    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.ICUTokenizerFactory"/>
        <filter class="solr.ICUFoldingFilterFactory"/>  <!-- NFKC, case folding, diacritics removed -->
        <filter class="solr.TrimFilterFactory"/>
      </analyzer>
    </fieldType>
    
    <!-- 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"/>
        <filter class="solr.TrimFilterFactory"/>
      </analyzer>
    </fieldType>
        
    <!-- single token analyzed text, for sorting.  Punctuation is significant. -->
    <fieldtype name="alphaSort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
      <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.ICUFoldingFilterFactory"/>
        <filter class="solr.TrimFilterFactory" />
      </analyzer>
    </fieldtype>

    <fieldType name="exactSearch_m" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.TrimFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English"/>
      </analyzer> 
    </fieldType>

    <!-- A text field with defaults appropriate for English -->
    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.ICUTokenizerFactory"/>
        <filter class="solr.ICUFoldingFilterFactory"/>  <!-- NFKC, case folding, diacritics removed -->
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <!-- EnglishMinimalStemFilterFactory is less aggressive than PorterStemFilterFactory: -->
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
        <!--
        <filter class="solr.PorterStemFilterFactory"/>
        -->
        <filter class="solr.TrimFilterFactory"/>
      </analyzer>
    </fieldType>
        
    <!-- queries for paths match documents at that path, or in descendent paths -->
    <fieldType name="descendent_path" class="solr.TextField">
      <analyzer type="index">
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
      </analyzer>
    </fieldType>
    
    <!-- queries for paths match documents at that path, or in ancestor paths -->
    <fieldType name="ancestor_path" class="solr.TextField">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
      </analyzer>
    </fieldType>

  </types>
  
</schema>