<?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.    
-->

<fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="../../main/resources/lucas.xsd">

	<field name="annotation1" index="yes" termVector="no" stored="yes"
		merge="true">
		<filters>
			<filter name="testFilterField" key1="value1"/>
		</filters>
		<annotations>
			<annotation type="de.julielab.jules.types.test.Annotation1">
				<filters>
					<filter name="testFilterAnnotation" key2="value2"/>
				</filters>
				<features>
					<feature name="featureString" />
				</features>
			</annotation>
			<annotation type="de.julielab.jules.types.test.Annotation1">
				<features>
					<feature name="featureInteger" numberFormat="##" />
				</features>
			</annotation>
		</annotations>
	</field>
</fields>