<?xml version="1.0" encoding="UTF-8"?>

<!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-->

<!-- The mapping file defines how the CAS structure is transformed
     into solr fields -->
<solrMapping>
  <!-- The document language is written into the language field -->
  <documentLanguage>language</documentLanguage>
  
  <!-- The whole text in the CAS is written into the text field -->
  <documentText>text</documentText>
  
  <!-- Each document has a unique id inside the DocumentId FS, the if field of that
       FS is written into the solr id field -->
  <fsMapping>
    <type name="org.apache.uima.solrcas.DocumentId">
      <map feature="id" field="id"/>
    </type>    
  </fsMapping>
  
  <!-- The document contains organization entity mentions, these
       the text covered by these annotations is written into the
       organization field -->
  <fsMapping>
    <type name="org.apache.uima.solrcas.Organization">
      <map feature="coveredText" field="organization"/>
    </type>    
  </fsMapping>
</solrMapping>