You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by to...@apache.org on 2012/02/29 23:43:13 UTC

svn commit: r1295330 [1/2] - in /lucene/dev/trunk/solr/contrib/uima: ./ src/java/org/apache/solr/uima/analysis/ src/java/org/apache/solr/uima/processor/ src/java/org/apache/solr/uima/processor/ae/ src/test-files/uima/ src/test/org/apache/solr/uima/anal...

Author: tommaso
Date: Wed Feb 29 22:43:12 2012
New Revision: 1295330

URL: http://svn.apache.org/viewvc?rev=1295330&view=rev
Log:
[SOLR-3013] - removing the ae package from Solr as it's now under analysis/uima module, adding the Solr factories for UIMA based tokenizers

Added:
    lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/
    lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactory.java
    lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMATypeAwareAnnotationsTokenizerFactory.java
    lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/stoptypes.txt
    lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-schema.xml
    lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-solrconfig.xml
    lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/
    lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactoryTest.java
    lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMATypeAwareAnnotationsTokenizerFactoryTest.java
Removed:
    lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/ae/
Modified:
    lucene/dev/trunk/solr/contrib/uima/CHANGES.txt
    lucene/dev/trunk/solr/contrib/uima/build.xml
    lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java

Modified: lucene/dev/trunk/solr/contrib/uima/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/CHANGES.txt?rev=1295330&r1=1295329&r2=1295330&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/contrib/uima/CHANGES.txt Wed Feb 29 22:43:12 2012
@@ -5,9 +5,12 @@ This file describes changes to the Solr 
 
 Introduction
 ------------
-This module is intended to be used while indexing documents.
-Its purpose is to provide additional on the fly automatically generated fields to the Solr index.
+This module is intended to be used both as an UpdateRequestProcessor while indexing documents and as a set of tokenizer/filters
+to be configured inside the schema.xml for use during analysis phase.
+UIMAUpdateRequestProcessor purpose is to provide additional on the fly automatically generated fields to the Solr index.
 Such fields could be language, concepts, keywords, sentences, named entities, etc.
+UIMA based tokenizers/filters can be used either inside plain Lucene or as index/query analyzers to be defined
+inside the schema.xml of a Solr core to create/filter tokens using specific UIMA annotations.
 
  UIMA Dependency
  ---------------

Modified: lucene/dev/trunk/solr/contrib/uima/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/build.xml?rev=1295330&r1=1295329&r2=1295330&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/build.xml (original)
+++ lucene/dev/trunk/solr/contrib/uima/build.xml Wed Feb 29 22:43:12 2012
@@ -25,4 +25,18 @@
 
   <import file="../contrib-build.xml"/>
 
+  <path id="classpath">
+    <pathelement path="${analyzers-uima.jar}"/>
+    <path refid="solr.base.classpath"/>
+  </path>
+
+  <target name="module-jars-to-solr" depends="jar-analyzers-uima">
+    <mkdir dir="${build.dir}/lucene-libs"/>
+    <copy todir="${build.dir}/lucene-libs" preservelastmodified="true" flatten="true" failonerror="true" overwrite="true">
+      <fileset file="${analyzers-uima.jar}"/>
+    </copy>
+  </target>
+
+  <target name="compile-core" depends="jar-analyzers-uima, solr-contrib-build.compile-core"/>
+  <target name="dist" depends="module-jars-to-solr, common-solr.dist"/>
 </project>

Added: lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactory.java?rev=1295330&view=auto
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactory.java (added)
+++ lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactory.java Wed Feb 29 22:43:12 2012
@@ -0,0 +1,46 @@
+package org.apache.solr.uima.analysis;
+
+/*
+ * 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.
+ */
+
+import org.apache.lucene.analysis.Tokenizer;
+import org.apache.lucene.analysis.uima.UIMAAnnotationsTokenizer;
+import org.apache.solr.analysis.BaseTokenizerFactory;
+
+import java.io.Reader;
+import java.util.Map;
+
+/**
+ * Solr {@link org.apache.solr.analysis.TokenizerFactory} for {@link UIMAAnnotationsTokenizer}
+ */
+public class UIMAAnnotationsTokenizerFactory extends BaseTokenizerFactory {
+
+  private String descriptorPath;
+  private String tokenType;
+
+  @Override
+  public void init(Map<String, String> args) {
+    super.init(args);
+    descriptorPath = args.get("descriptorPath");
+    tokenType = args.get("tokenType");
+  }
+
+  @Override
+  public Tokenizer create(Reader input) {
+    return new UIMAAnnotationsTokenizer(descriptorPath, tokenType, input);
+  }
+}

Added: lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMATypeAwareAnnotationsTokenizerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMATypeAwareAnnotationsTokenizerFactory.java?rev=1295330&view=auto
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMATypeAwareAnnotationsTokenizerFactory.java (added)
+++ lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/analysis/UIMATypeAwareAnnotationsTokenizerFactory.java Wed Feb 29 22:43:12 2012
@@ -0,0 +1,48 @@
+package org.apache.solr.uima.analysis;
+
+/*
+ * 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.
+ */
+
+import org.apache.lucene.analysis.Tokenizer;
+import org.apache.lucene.analysis.uima.UIMATypeAwareAnnotationsTokenizer;
+import org.apache.solr.analysis.BaseTokenizerFactory;
+
+import java.io.Reader;
+import java.util.Map;
+
+/**
+ * Solr {@link org.apache.solr.analysis.TokenizerFactory} for {@link UIMATypeAwareAnnotationsTokenizer}
+ */
+public class UIMATypeAwareAnnotationsTokenizerFactory extends BaseTokenizerFactory {
+
+  private String descriptorPath;
+  private String tokenType;
+  private String featurePath;
+
+  @Override
+  public void init(Map<String, String> args) {
+    super.init(args);
+    descriptorPath = args.get("descriptorPath");
+    tokenType = args.get("tokenType");
+    featurePath = args.get("featurePath");
+  }
+
+  @Override
+  public Tokenizer create(Reader input) {
+    return new UIMATypeAwareAnnotationsTokenizer(descriptorPath, tokenType, featurePath, input);
+  }
+}

Modified: lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java?rev=1295330&r1=1295329&r2=1295330&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java (original)
+++ lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java Wed Feb 29 22:43:12 2012
@@ -23,8 +23,8 @@ import org.apache.solr.common.SolrInputD
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.uima.processor.SolrUIMAConfiguration.MapField;
-import org.apache.solr.uima.processor.ae.AEProvider;
-import org.apache.solr.uima.processor.ae.AEProviderFactory;
+import org.apache.lucene.analysis.uima.ae.AEProvider;
+import org.apache.lucene.analysis.uima.ae.AEProviderFactory;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
 import org.apache.uima.analysis_engine.AnalysisEngine;

Added: lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/stoptypes.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/stoptypes.txt?rev=1295330&view=auto
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/stoptypes.txt (added)
+++ lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/stoptypes.txt Wed Feb 29 22:43:12 2012
@@ -0,0 +1,25 @@
+# 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.
+vbg
+vbz
+vbd
+vbn
+vb
+bez
+cc
+cd
+at
+.
+:
\ No newline at end of file

Added: lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-schema.xml?rev=1295330&view=auto
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-schema.xml (added)
+++ lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-schema.xml Wed Feb 29 22:43:12 2012
@@ -0,0 +1,680 @@
+<?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.
+  -->
+
+  <!--
+    This is the Solr schema file. This file should be named "schema.xml"
+    and should be in the conf directory under the solr home (i.e.
+    ./solr/conf/schema.xml by default) or located where the classloader
+    for the Solr webapp can find it. This example schema is the
+    recommended starting point for users. It should be kept correct and
+    concise, usable out-of-the-box. For more information, on how to
+    customize this file, please see
+    http://wiki.apache.org/solr/SchemaXml PERFORMANCE NOTE: this schema
+    includes many optional features and should not be used for
+    benchmarking. To improve performance one could - set stored="false"
+    for all fields possible (esp large fields) when you only need to
+    search on the field but don't need to return the original value. -
+    set indexed="false" if you don't need to search on the field, but
+    only return the field as a result of searching on other indexed
+    fields. - remove all unneeded copyField statements - for best index
+    size and searching performance, set "index" to false for all general
+    text fields, use copyField to copy them to the catchall "text"
+    field, and use that for searching. - For maximum indexing
+    performance, use the StreamingUpdateSolrServer java client. -
+    Remember to run the JVM in server mode, and use a higher logging
+    level that avoids logging every request
+  -->
+
+<schema name="sample" version="1.2">
+  <!--
+    attribute "name" is the name of this schema and is only used for
+    display purposes. Applications should change this to reflect the
+    nature of the search collection. version="1.2" is Solr's version
+    number for the schema syntax and semantics. It should not normally
+    be changed by applications. 1.0: multiValued attribute did not
+    exist, all fields are multiValued by nature 1.1: multiValued
+    attribute introduced, false by default 1.2: omitTermFreqAndPositions
+    attribute introduced, true by default except for text fields.
+  -->
+
+  <types>
+    <!--
+      field type definitions. The "name" attribute is just a label to be
+      used by field definitions. The "class" attribute and any other
+      attributes determine the real behavior of the fieldType. Class
+      names starting with "solr" refer to java classes in the
+      org.apache.solr.analysis package.
+    -->
+
+    <!--
+      The StrField type is not analyzed, but indexed/stored verbatim. -
+      StrField and TextField support an optional compressThreshold which
+      limits compression (if enabled in the derived fields) to values
+      which exceed a certain size (in characters).
+    -->
+    <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" />
+    <!--
+      Binary data type. The data should be sent/retrieved in as Base64
+      encoded Strings
+    -->
+    <fieldtype name="binary" class="solr.BinaryField" />
+
+    <!--
+      The optional sortMissingLast and sortMissingFirst attributes are
+      currently supported on types that are sorted internally as
+      strings. This includes
+      "string","boolean","sint","slong","sfloat","sdouble","pdate" - If
+      sortMissingLast="true", then a sort on this field will cause
+      documents without the field to come after documents with the
+      field, regardless of the requested sort order (asc or desc). - If
+      sortMissingFirst="true", then a sort on this field will cause
+      documents without the field to come before documents with the
+      field, regardless of the requested sort order. - If
+      sortMissingLast="false" and sortMissingFirst="false" (the
+      default), then default lucene sorting will be used which places
+      docs without the field first in an ascending sort and last in a
+      descending sort.
+    -->
+
+    <!--
+      Default numeric field types. For faster range queries, consider
+      the tint/tfloat/tlong/tdouble types.
+    -->
+    <fieldType name="int" class="solr.TrieIntField"
+      precisionStep="0" omitNorms="true" positionIncrementGap="0" />
+    <fieldType name="float" class="solr.TrieFloatField"
+      precisionStep="0" omitNorms="true" positionIncrementGap="0" />
+    <fieldType name="long" class="solr.TrieLongField"
+      precisionStep="0" omitNorms="true" positionIncrementGap="0" />
+    <fieldType name="double" class="solr.TrieDoubleField"
+      precisionStep="0" omitNorms="true" positionIncrementGap="0" />
+
+    <!--
+      Numeric field types that index each value at various levels of
+      precision to accelerate range queries when the number of values
+      between the range endpoints is large. See the javadoc for
+      NumericRangeQuery for internal implementation details. Smaller
+      precisionStep values (specified in bits) will lead to more tokens
+      indexed per value, slightly larger index size, and faster range
+      queries. A precisionStep of 0 disables indexing at different
+      precision levels.
+    -->
+    <fieldType name="tint" class="solr.TrieIntField"
+      precisionStep="8" omitNorms="true" positionIncrementGap="0" />
+    <fieldType name="tfloat" class="solr.TrieFloatField"
+      precisionStep="8" omitNorms="true" positionIncrementGap="0" />
+    <fieldType name="tlong" class="solr.TrieLongField"
+      precisionStep="8" omitNorms="true" positionIncrementGap="0" />
+    <fieldType name="tdouble" class="solr.TrieDoubleField"
+      precisionStep="8" omitNorms="true" positionIncrementGap="0" />
+
+    <!--
+      The format for this date field is of the form
+      1995-12-31T23:59:59Z, and is a more restricted form of the
+      canonical representation of dateTime
+      http://www.w3.org/TR/xmlschema-2/#dateTime The trailing "Z"
+      designates UTC time and is mandatory. Optional fractional seconds
+      are allowed: 1995-12-31T23:59:59.999Z All other components are
+      mandatory. Expressions can also be used to denote calculations
+      that should be performed relative to "NOW" to determine the value,
+      ie... NOW/HOUR ... Round to the start of the current hour NOW-1DAY
+      ... Exactly 1 day prior to now NOW/DAY+6MONTHS+3DAYS ... 6 months
+      and 3 days in the future from the start of the current day Consult
+      the DateField javadocs for more information. Note: For faster
+      range queries, consider the tdate type
+    -->
+    <fieldType name="date" class="solr.TrieDateField"
+      omitNorms="true" precisionStep="0" positionIncrementGap="0" />
+
+    <!--
+      A Trie based date field for faster date range queries and date
+      faceting.
+    -->
+    <fieldType name="tdate" class="solr.TrieDateField"
+      omitNorms="true" precisionStep="6" positionIncrementGap="0" />
+
+
+    <!--
+      Note: These should only be used for compatibility with existing
+      indexes (created with older Solr versions) or if
+      "sortMissingFirst" or "sortMissingLast" functionality is needed.
+      Use Trie based fields instead. Plain numeric field types that
+      store and index the text value verbatim (and hence don't support
+      range queries, since the lexicographic ordering isn't equal to the
+      numeric ordering)
+    -->
+    <fieldType name="pint" class="solr.IntField" omitNorms="true" />
+    <fieldType name="plong" class="solr.LongField" omitNorms="true" />
+    <fieldType name="pfloat" class="solr.FloatField"
+      omitNorms="true" />
+    <fieldType name="pdouble" class="solr.DoubleField"
+      omitNorms="true" />
+    <fieldType name="pdate" class="solr.DateField"
+      sortMissingLast="true" omitNorms="true" />
+
+
+    <!--
+      Note: These should only be used for compatibility with existing
+      indexes (created with older Solr versions) or if
+      "sortMissingFirst" or "sortMissingLast" functionality is needed.
+      Use Trie based fields instead. Numeric field types that manipulate
+      the value into a string value that isn't human-readable in its
+      internal form, but with a lexicographic ordering the same as the
+      numeric ordering, so that range queries work correctly.
+    -->
+    <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 "RandomSortField" is not used to store or search any data. You
+      can declare fields of this type it in your schema to generate
+      pseudo-random orderings of your docs for sorting purposes. The
+      ordering is generated based on the field name and the version of
+      the index, As long as the index version remains unchanged, and the
+      same field name is reused, the ordering of the docs will be
+      consistent. If you want different psuedo-random orderings of
+      documents, for the same version of the index, use a dynamicField
+      and change the name
+    -->
+    <fieldType name="random" class="solr.RandomSortField"
+      indexed="true" />
+
+    <!--
+      solr.TextField allows the specification of custom text analyzers
+      specified as a tokenizer and a list of token filters. Different
+      analyzers may be specified for indexing and querying. The optional
+      positionIncrementGap puts space between multiple fields of this
+      type on the same document, with the purpose of preventing false
+      phrase matching across fields. For more info on customizing your
+      analyzer chain, please see
+      http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
+    -->
+
+    <!--
+      One can also specify an existing Analyzer class that has a default
+      constructor via the class attribute on the analyzer element
+      <fieldType name="text_greek" class="solr.TextField"> <analyzer
+      class="org.apache.lucene.analysis.el.GreekAnalyzer"/> </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.MockTokenizerFactory" />
+      </analyzer>
+    </fieldType>
+
+    <!--
+      A text field that uses WordDelimiterFilter to enable splitting and
+      matching of words on case-change, alpha numeric boundaries, and
+      non-alphanumeric chars, so that a query of "wifi" or "wi fi" could
+      match a document containing "Wi-Fi". Synonyms and stopwords are
+      customized by external files, and stemming is enabled.
+    -->
+    <fieldType name="text" class="solr.TextField"
+      positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <!--
+          in this example, we will only use synonyms at query time
+          <filter class="solr.SynonymFilterFactory"
+          synonyms="index_synonyms.txt" ignoreCase="true"
+          expand="false"/>
+        -->
+        <!--
+          Case insensitive stop word removal. add
+          enablePositionIncrements=true in both the index and query
+          analyzers to leave a 'gap' for more accurate phrase queries.
+        -->
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="1" generateNumberParts="1" catenateWords="1"
+          catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" />
+        <filter class="solr.LowerCaseFilterFactory" />
+        
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.MockTokenizerFactory" />
+
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="1" generateNumberParts="1" catenateWords="0"
+          catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" />
+        <filter class="solr.LowerCaseFilterFactory" />
+        
+      </analyzer>
+    </fieldType>
+
+
+    <!--
+      Less flexible matching, but less false matches. Probably not ideal
+      for product names, but may be good for SKUs. Can insert dashes in
+      the wrong place and still match.
+    -->
+    <fieldType name="textTight" class="solr.TextField"
+      positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="0" generateNumberParts="0" catenateWords="1"
+          catenateNumbers="1" catenateAll="0" />
+        <filter class="solr.LowerCaseFilterFactory" />
+        
+        <!--
+          this filter can remove any duplicate tokens that appear at the
+          same position - sometimes possible with WordDelimiterFilter in
+          conjuncton with stemming.
+        -->
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
+      </analyzer>
+    </fieldType>
+
+    <fieldType name="uima_sentences" class="solr.TextField" positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="org.apache.solr.uima.analysis.UIMAAnnotationsTokenizerFactory"
+                   descriptorPath="/uima/AggregateSentenceAE.xml" tokenType="org.apache.uima.SentenceAnnotation"/>
+      </analyzer>
+    </fieldType>
+
+    <fieldType name="uima_nouns" class="solr.TextField" positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="org.apache.solr.uima.analysis.UIMATypeAwareAnnotationsTokenizerFactory"
+                   descriptorPath="/uima/AggregateSentenceAE.xml" tokenType="org.apache.uima.TokenAnnotation"
+                   featurePath="posTag"/>
+        <filter class="solr.TypeTokenFilterFactory" types="uima/stoptypes.txt" />
+      </analyzer>
+    </fieldType>
+
+
+    <!--
+      A general unstemmed text field - good if one does not know the
+      language of the field
+    -->
+    <fieldType name="textgen" class="solr.TextField"
+      positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="1" generateNumberParts="1" catenateWords="1"
+          catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" />
+        <filter class="solr.LowerCaseFilterFactory" />
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="1" generateNumberParts="1" catenateWords="0"
+          catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" />
+        <filter class="solr.LowerCaseFilterFactory" />
+      </analyzer>
+    </fieldType>
+
+
+    <!--
+      A general unstemmed text field that indexes tokens normally and
+      also reversed (via ReversedWildcardFilterFactory), to enable more
+      efficient leading wildcard queries.
+    -->
+    <fieldType name="text_rev" class="solr.TextField"
+      positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="1" generateNumberParts="1" catenateWords="1"
+          catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" />
+        <filter class="solr.LowerCaseFilterFactory" />
+        <filter class="solr.ReversedWildcardFilterFactory"
+          withOriginal="true" maxPosAsterisk="3" maxPosQuestion="2"
+          maxFractionAsterisk="0.33" />
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <filter class="solr.WordDelimiterFilterFactory"
+          generateWordParts="1" generateNumberParts="1" catenateWords="0"
+          catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" />
+        <filter class="solr.LowerCaseFilterFactory" />
+      </analyzer>
+    </fieldType>
+
+    <!-- charFilter + WhitespaceTokenizer  -->
+    <!--
+      <fieldType name="textCharNorm" class="solr.TextField"
+      positionIncrementGap="100" > <analyzer> <charFilter
+      class="solr.MappingCharFilterFactory"
+      mapping="mapping-ISOLatin1Accent.txt"/> <tokenizer
+      class="solr.MockTokenizerFactory"/> </analyzer> </fieldType>
+    -->
+
+    <!--
+      This is an example of using the KeywordTokenizer along With
+      various TokenFilterFactories to produce a sortable field that does
+      not include some properties of the source text
+    -->
+    <fieldType name="alphaOnlySort" class="solr.TextField"
+      sortMissingLast="true" omitNorms="true">
+      <analyzer>
+        <!--
+          KeywordTokenizer does no actual tokenizing, so the entire
+          input string is preserved as a single token
+        -->
+        <tokenizer class="solr.MockTokenizerFactory" pattern="keyword"/>
+        <!--
+          The LowerCase TokenFilter does what you expect, which can be
+          when you want your sorting to be case insensitive
+        -->
+        <filter class="solr.LowerCaseFilterFactory" />
+        <!-- The TrimFilter removes any leading or trailing whitespace -->
+        <filter class="solr.TrimFilterFactory" />
+        <!--
+          The PatternReplaceFilter gives you the flexibility to use Java
+          Regular expression to replace any sequence of characters
+          matching a pattern with an arbitrary replacement string, which
+          may include back references to portions of the original string
+          matched by the pattern. See the Java Regular Expression
+          documentation for more information on pattern and replacement
+          string syntax.
+
+          http://java.sun.com/j2se/1.6.0/docs/api/java/util/regex/package-summary.html
+        -->
+        <filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z])"
+          replacement="" replace="all" />
+      </analyzer>
+    </fieldType>
+
+    <fieldtype name="phonetic" stored="false" indexed="true"
+      class="solr.TextField">
+      <analyzer>
+        <tokenizer class="solr.StandardTokenizerFactory" />
+        <filter class="solr.DoubleMetaphoneFilterFactory" inject="false" />
+      </analyzer>
+    </fieldtype>
+
+    <fieldtype name="payloads" stored="false" indexed="true"
+      class="solr.TextField">
+      <analyzer>
+        <tokenizer class="solr.MockTokenizerFactory" />
+        <!--
+          The DelimitedPayloadTokenFilter can put payloads on tokens...
+          for example, a token of "foo|1.4" would be indexed as "foo"
+          with a payload of 1.4f Attributes of the
+          DelimitedPayloadTokenFilterFactory : "delimiter" - a one
+          character delimiter. Default is | (pipe) "encoder" - how to
+          encode the following value into a playload float ->
+          org.apache.lucene.analysis.payloads.FloatEncoder, integer ->
+          o.a.l.a.p.IntegerEncoder identity -> o.a.l.a.p.IdentityEncoder
+          Fully Qualified class name implementing PayloadEncoder,
+          Encoder must have a no arg constructor.
+        -->
+        <filter class="solr.DelimitedPayloadTokenFilterFactory"
+          encoder="float" />
+      </analyzer>
+    </fieldtype>
+
+    <!--
+      lowercases the entire field value, keeping it as a single token.
+    -->
+    <fieldType name="lowercase" class="solr.TextField"
+      positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="solr.MockTokenizerFactory" pattern="keyword"/>
+        <filter class="solr.LowerCaseFilterFactory" />
+      </analyzer>
+    </fieldType>
+
+
+    <!--
+      since fields of this type are by default not stored or indexed,
+      any data added to them will be ignored outright.
+    -->
+    <fieldtype name="ignored" stored="false" indexed="false"
+      multiValued="true" class="solr.StrField" />
+
+  </types>
+
+
+  <fields>
+    <!--
+      Valid attributes for fields: name: mandatory - the name for the
+      field type: mandatory - the name of a previously defined type from
+      the <types> section indexed: true if this field should be indexed
+      (searchable or sortable) stored: true if this field should be
+      retrievable compressed: [false] if this field should be stored
+      using gzip compression (this will only apply if the field type is
+      compressable; among the standard field types, only TextField and
+      StrField are) multiValued: true if this field may contain multiple
+      values per document omitNorms: (expert) set to true to omit the
+      norms associated with this field (this disables length
+      normalization and index-time boosting for the field, and saves
+      some memory). Only full-text fields or fields that need an
+      index-time boost need norms. termVectors: [false] set to true to
+      store the term vector for a given field. When using MoreLikeThis,
+      fields used for similarity should be stored for best performance.
+      termPositions: Store position information with the term vector.
+      This will increase storage costs. termOffsets: Store offset
+      information with the term vector. This will increase storage
+      costs. default: a value that should be used if no value is
+      specified when adding a document.
+    -->
+    <field name="id" type="string" indexed="true" stored="true"
+      required="true" />
+    <field name="sku" type="textTight" indexed="true" stored="true"
+      omitNorms="true" />
+    <field name="name" type="textgen" indexed="true" stored="true" />
+    <field name="alphaNameSort" type="alphaOnlySort" indexed="true"
+      stored="false" />
+    <field name="manu" type="textgen" indexed="true" stored="true"
+      omitNorms="true" />
+    <field name="cat" type="text_ws" indexed="true" stored="true"
+      multiValued="true" omitNorms="true" />
+    <field name="features" type="text" indexed="true" stored="true"
+      multiValued="true" />
+    <field name="includes" type="text" indexed="true" stored="true"
+      termVectors="true" termPositions="true" termOffsets="true" />
+
+    <field name="sentences" type="uima_sentences" indexed="true" stored="true" multiValued="true"
+          termVectors="true" termPositions="true" termOffsets="true" />
+    <field name="nouns" type="uima_nouns" indexed="true" stored="true" multiValued="true"
+      termVectors="true" termPositions="true" termOffsets="true" />
+
+    <field name="weight" type="float" indexed="true" stored="true" />
+    <field name="price" type="float" indexed="true" stored="true" />
+    <field name="popularity" type="int" indexed="true" stored="true" />
+    <field name="inStock" type="boolean" indexed="true" stored="true" />
+
+
+    <!--
+      Common metadata fields, named specifically to match up with
+      SolrCell metadata when parsing rich documents such as Word, PDF.
+      Some fields are multiValued only because Tika currently may return
+      multiple values for them.
+    -->
+    <field name="title" type="text" indexed="true" stored="true"
+      multiValued="true" />
+    <field name="subject" type="text" indexed="true" stored="true" />
+    <field name="description" type="text" indexed="true" stored="true" />
+    <field name="comments" type="text" indexed="true" stored="true" />
+    <field name="author" type="textgen" indexed="true" stored="true" />
+    <field name="keywords" type="textgen" indexed="true" stored="true" />
+    <field name="category" type="textgen" indexed="true" stored="true" />
+    <field name="content_type" type="string" indexed="true"
+      stored="true" multiValued="true" />
+    <field name="last_modified" type="date" indexed="true" stored="true" />
+    <field name="links" type="string" indexed="true" stored="true"
+      multiValued="true" />
+
+
+    <!--
+      catchall field, containing all other searchable text fields
+      (implemented via copyField further on in this schema
+    -->
+    <field name="text" type="text" indexed="true" stored="false"
+      multiValued="true" />
+
+    <!--
+      catchall text field that indexes tokens both normally and in
+      reverse for efficient leading wildcard queries.
+    -->
+    <field name="text_rev" type="text_rev" indexed="true" stored="false"
+      multiValued="true" />
+
+    <!--
+      non-tokenized version of manufacturer to make it easier to sort or
+      group results by manufacturer. copied from "manu" via copyField
+    -->
+    <field name="manu_exact" type="string" indexed="true" stored="false" />
+
+    <field name="payloads" type="payloads" indexed="true" stored="true" />
+
+    <!--
+      Uncommenting the following will create a "timestamp" field using a
+      default value of "NOW" to indicate when each document was indexed.
+    -->
+    <!--
+      <field name="timestamp" type="date" indexed="true" stored="true"
+      default="NOW" multiValued="false"/>
+    -->
+
+  <field name="language" type="string" indexed="true" stored="true" required="false"/>
+  <field name="sentence" type="text" indexed="true" stored="true" multiValued="true" required="false" />
+  <field name="sentiment" type="string" indexed="true" stored="true" multiValued="true"/>
+  <field name="entity" type="text" indexed="true" stored="true" multiValued="true"/>
+
+    <!--
+      Dynamic field definitions. If a field name is not found,
+      dynamicFields will be used if the name matches any of the
+      patterns. RESTRICTION: the glob-like pattern in the name attribute
+      must have a "*" only at the start or the end. EXAMPLE: name="*_i"
+      will match any field ending in _i (like myid_i, z_i) Longer
+      patterns will be matched first. if equal size patterns both match,
+      the first appearing in the schema will be used. <dynamicField
+      name="*_i" type="int" indexed="true" stored="true"/> <dynamicField
+      name="*_s" type="string" indexed="true" stored="true"/>
+      <dynamicField name="*_l" type="long" indexed="true"
+      stored="true"/> <dynamicField name="*_t" type="text"
+      indexed="true" stored="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="*_dt" type="date"
+      indexed="true" stored="true"/> <dynamicField name="*_ti"
+      type="tint" indexed="true" stored="true"/> <dynamicField
+      name="*_tl" type="tlong" indexed="true" stored="true"/>
+      <dynamicField name="*_tf" type="tfloat" indexed="true"
+      stored="true"/> <dynamicField name="*_td" type="tdouble"
+      indexed="true" stored="true"/> <dynamicField name="*_tdt"
+      type="tdate" indexed="true" stored="true"/> <dynamicField
+      name="*_pi" type="pint" indexed="true" stored="true"/>
+
+      <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
+      <dynamicField name="attr_*" type="textgen" indexed="true"
+      stored="true" multiValued="true"/> <dynamicField name="random_*"
+      type="random" />
+    -->
+    <dynamicField name="*_sm" type="string" indexed="true" stored="true" 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" /-->
+
+  </fields>
+
+  <!--
+    Field to use to determine and enforce document uniqueness. Unless
+    this field is marked with required="false", it will be a required
+    field
+  -->
+  <uniqueKey>id</uniqueKey>
+
+  <!--
+    field for the QueryParser to use when an explicit fieldname is
+    absent
+  -->
+  <defaultSearchField>text</defaultSearchField>
+
+  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
+  <solrQueryParser defaultOperator="OR" />
+
+  <!--
+    copyField commands copy one field to another at the time a document
+    is added to the index. It's used either to index the same field
+    differently, or to add multiple fields to the same field for
+    easier/faster searching.
+  -->
+
+  <copyField source="cat" dest="text" />
+  <copyField source="name" dest="text" />
+  <copyField source="manu" dest="text" />
+  <copyField source="features" dest="text" />
+  <copyField source="includes" dest="text" />
+  <copyField source="text" dest="nouns" />
+  <copyField source="text" dest="sentences" />
+  <copyField source="manu" dest="manu_exact" />
+
+
+  <!--copyField source="Titolo" dest="text"/-->
+
+  <!--
+    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"/> -->
+
+  <!--
+    copy name to alphaNameSort, a field designed for sorting by name
+  -->
+  <!-- <copyField source="name" dest="alphaNameSort"/> -->
+
+
+  <!--
+    Similarity is the scoring routine for each document vs. a query. A
+    custom similarity may be specified here, but the default is fine for
+    most applications.
+  -->
+  <!--
+    <similarity class="org.apache.lucene.search.DefaultSimilarity"/>
+  -->
+  <!--
+    ... OR ... Specify a SimilarityFactory class name implementation
+    allowing parameters to be used.
+  -->
+  <!--
+    <similarity class="com.example.solr.CustomSimilarityFactory"> <str
+    name="paramkey">param value</str> </similarity>
+  -->
+
+
+</schema>

Added: lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-solrconfig.xml?rev=1295330&view=auto
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-solrconfig.xml (added)
+++ lucene/dev/trunk/solr/contrib/uima/src/test-files/uima/uima-tokenizers-solrconfig.xml Wed Feb 29 22:43:12 2012
@@ -0,0 +1,1006 @@
+<?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.
+  -->
+  <!--
+    For more details about configurations options that may appear in
+    this file, see http://wiki.apache.org/solr/SolrConfigXml.
+
+    Specifically, the Solr Config can support XInclude, which may make
+    it easier to manage the configuration. See
+    https://issues.apache.org/jira/browse/SOLR-1167
+  -->
+<config xmlns:xi="http://www.w3.org/2001/XInclude">
+  <luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
+  <!--
+    lib directives can be used to instruct Solr to load an Jars
+    identified and use them to resolve any "plugins" specified in your
+    solrconfig.xml or schema.xml (ie: Analyzers, Request Handlers,
+    etc...). All directories and paths are resolved relative the
+    instanceDir. If a "./lib" directory exists in your instanceDir, all
+    files found in it are included as if you had used the following
+    syntax... <lib dir="./lib" />
+  -->
+  <!--
+    A dir option by itself adds any files found in the directory to the
+    classpath, this is useful for including all jars in a directory.
+  -->
+  <lib dir="../../contrib/extraction/lib" />
+  <!--
+    When a regex is specified in addition to a directory, only the files
+    in that directory which completely match the regex (anchored on both
+    ends) will be included.
+  -->
+  <lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar" />
+  <lib dir="../../dist/" regex="apache-solr-clustering-\d.*\.jar" />
+  <!--
+    If a dir option (with or without a regex) is used and nothing is
+    found that matches, it will be ignored
+  -->
+  <lib dir="../../contrib/clustering/lib/downloads/" />
+  <lib dir="../../contrib/clustering/lib/" />
+  <lib dir="/total/crap/dir/ignored" />
+  <!--
+    an exact path can be used to specify a specific file. This will
+    cause a serious error to be logged if it can't be loaded. <lib
+    path="../a-jar-that-does-not-exist.jar" />
+  -->
+
+  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
+
+  <!--
+    Used to specify an alternate directory to hold all index data other
+    than the default ./data under the Solr home. If replication is in
+    use, this should match the replication configuration.
+  -->
+  <dataDir>${solr.data.dir:}</dataDir>
+
+
+  <!--
+    WARNING: this <indexDefaults> section only provides defaults for
+    index writers in general. See also the <mainIndex> section after
+    that when changing parameters for Solr's main Lucene index.
+  -->
+  <indexDefaults>
+    <!--
+      Values here affect all index writers and act as a default unless
+      overridden.
+    -->
+    <useCompoundFile>false</useCompoundFile>
+
+    <mergeFactor>10</mergeFactor>
+    <!--
+      If both ramBufferSizeMB and maxBufferedDocs is set, then Lucene
+      will flush based on whichever limit is hit first.
+    -->
+    <!--<maxBufferedDocs>1000</maxBufferedDocs>-->
+
+    <!--
+      Sets the amount of RAM that may be used by Lucene indexing for
+      buffering added documents and deletions before they are flushed to
+      the Directory.
+    -->
+    <ramBufferSizeMB>32</ramBufferSizeMB>
+    <!-- <maxMergeDocs>2147483647</maxMergeDocs> -->
+    <maxFieldLength>10000</maxFieldLength>
+    <writeLockTimeout>1000</writeLockTimeout>
+
+    <!--
+      Expert: Turn on Lucene's auto commit capability. This causes
+      intermediate segment flushes to write a new lucene index
+      descriptor, enabling it to be opened by an external IndexReader.
+      This can greatly slow down indexing speed. NOTE: Despite the name,
+      this value does not have any relation to Solr's autoCommit
+      functionality
+    -->
+    <!--<luceneAutoCommit>false</luceneAutoCommit>-->
+
+    <!--
+      Expert: The Merge Policy in Lucene controls how merging is handled
+      by Lucene. The default in 2.3 is the LogByteSizeMergePolicy,
+      previous versions used LogDocMergePolicy. LogByteSizeMergePolicy
+      chooses segments to merge based on their size. The Lucene 2.2
+      default, LogDocMergePolicy chose when to merge based on number of
+      documents Other implementations of MergePolicy must have a
+      no-argument constructor
+    -->
+    <!--
+      <mergePolicy
+      class="org.apache.lucene.index.LogByteSizeMergePolicy"/>
+    -->
+
+    <!--
+      Expert: The Merge Scheduler in Lucene controls how merges are
+      performed. The ConcurrentMergeScheduler (Lucene 2.3 default) can
+      perform merges in the background using separate threads. The
+      SerialMergeScheduler (Lucene 2.2 default) does not.
+    -->
+    <!--
+      <mergeScheduler
+      class="org.apache.lucene.index.ConcurrentMergeScheduler"/>
+    -->
+
+
+    <!--
+      This option specifies which Lucene LockFactory implementation to
+      use. single = SingleInstanceLockFactory - suggested for a
+      read-only index or when there is no possibility of another process
+      trying to modify the index. native = NativeFSLockFactory - uses OS
+      native file locking simple = SimpleFSLockFactory - uses a plain
+      file for locking (For backwards compatibility with Solr 1.2,
+      'simple' is the default if not specified.)
+    -->
+    <lockType>native</lockType>
+    <!--
+      Expert: Controls how often Lucene loads terms into memory
+    -->
+    <!--<termIndexInterval>256</termIndexInterval>-->
+  </indexDefaults>
+
+  <mainIndex>
+    <!-- options specific to the main on-disk lucene index -->
+    <useCompoundFile>false</useCompoundFile>
+    <ramBufferSizeMB>32</ramBufferSizeMB>
+    <mergeFactor>10</mergeFactor>
+    <!-- Deprecated -->
+    <!--<maxBufferedDocs>1000</maxBufferedDocs>-->
+    <!--<maxMergeDocs>2147483647</maxMergeDocs>-->
+
+    <!--
+      inherit from indexDefaults <maxFieldLength>10000</maxFieldLength>
+    -->
+
+    <!--
+      If true, unlock any held write or commit locks on startup. This
+      defeats the locking mechanism that allows multiple processes to
+      safely access a lucene index, and should be used with care. This
+      is not needed if lock type is 'none' or 'single'
+    -->
+    <unlockOnStartup>false</unlockOnStartup>
+
+    <!--
+      If true, IndexReaders will be reopened (often more efficient)
+      instead of closed and then opened.
+    -->
+    <reopenReaders>true</reopenReaders>
+
+    <!--
+      Expert: Controls how often Lucene loads terms into memory. Default
+      is 128 and is likely good for most everyone.
+    -->
+    <!--<termIndexInterval>256</termIndexInterval>-->
+
+    <!--
+      Custom deletion policies can specified here. The class must
+      implement org.apache.lucene.index.IndexDeletionPolicy.
+
+      http://lucene.apache.org/java/2_3_2/api/org/apache/lucene/index/IndexDeletionPolicy.html
+
+      The standard Solr IndexDeletionPolicy implementation supports
+      deleting index commit points on number of commits, age of commit
+      point and optimized status. The latest commit point should always
+      be preserved regardless of the criteria.
+    -->
+    <deletionPolicy class="solr.SolrDeletionPolicy">
+      <!-- The number of commit points to be kept -->
+      <str name="maxCommitsToKeep">1</str>
+      <!-- The number of optimized commit points to be kept -->
+      <str name="maxOptimizedCommitsToKeep">0</str>
+      <!--
+        Delete all commit points once they have reached the given age.
+        Supports DateMathParser syntax e.g. <str
+        name="maxCommitAge">30MINUTES</str> <str
+        name="maxCommitAge">1DAY</str>
+      -->
+    </deletionPolicy>
+
+    <!--
+      To aid in advanced debugging, you may turn on IndexWriter debug
+      logging. Setting to true will set the file that the underlying
+      Lucene IndexWriter will write its debug infostream to.
+    -->
+    <infoStream file="INFOSTREAM.txt">false</infoStream>
+
+  </mainIndex>
+
+  <!--
+    Enables JMX if and only if an existing MBeanServer is found, use
+    this if you want to configure JMX through JVM parameters. Remove
+    this to disable exposing Solr configuration and statistics to JMX.
+
+    If you want to connect to a particular server, specify the agentId
+    e.g. <jmx agentId="myAgent" /> If you want to start a new
+    MBeanServer, specify the serviceUrl e.g <jmx
+    serviceUrl="service:jmx:rmi:///jndi/rmi://localhost:9999/solr"/> For
+    more details see http://wiki.apache.org/solr/SolrJmx
+  -->
+  <jmx />
+
+  <!-- the default high-performance update handler -->
+  <updateHandler class="solr.DirectUpdateHandler2">
+    <!--
+      A prefix of "solr." for class names is an alias that causes solr
+      to search appropriate packages, including
+      org.apache.solr.(search|update|request|core|analysis)
+    -->
+
+    <!--
+      Perform a <commit/> automatically under certain conditions:
+      maxDocs - number of updates since last commit is greater than this
+      maxTime - oldest uncommited update (in ms) is this long ago
+      Instead of enabling autoCommit, consider using "commitWithin" when
+      adding documents. http://wiki.apache.org/solr/UpdateXmlMessages
+      <autoCommit> <maxDocs>10000</maxDocs> <maxTime>1000</maxTime>
+      </autoCommit>
+    -->
+
+
+    <!--
+      The RunExecutableListener executes an external command from a hook
+      such as postCommit or postOptimize. exe - the name of the
+      executable to run dir - dir to use as the current working
+      directory. default="." wait - the calling thread waits until the
+      executable returns. default="true" args - the arguments to pass to
+      the program. default=nothing env - environment variables to set.
+      default=nothing
+    -->
+    <!--
+      A postCommit event is fired after every commit or optimize command
+      <listener event="postCommit" class="solr.RunExecutableListener">
+      <str name="exe">solr/bin/snapshooter</str> <str name="dir">.</str>
+      <bool name="wait">true</bool> <arr name="args"> <str>arg1</str>
+      <str>arg2</str> </arr> <arr name="env"> <str>MYVAR=val1</str>
+      </arr> </listener>
+    -->
+    <!--
+      A postOptimize event is fired only after every optimize command
+      <listener event="postOptimize" class="solr.RunExecutableListener">
+      <str name="exe">snapshooter</str> <str name="dir">solr/bin</str>
+      <bool name="wait">true</bool> </listener>
+    -->
+
+  </updateHandler>
+
+  <!--
+    Use the following format to specify a custom IndexReaderFactory -
+    allows for alternate IndexReader implementations. ** Experimental
+    Feature ** Please note - Using a custom IndexReaderFactory may
+    prevent certain other features from working. The API to
+    IndexReaderFactory may change without warning or may even be removed
+    from future releases if the problems cannot be resolved. ** Features
+    that may not work with custom IndexReaderFactory ** The
+    ReplicationHandler assumes a disk-resident index. Using a custom
+    IndexReader implementation may cause incompatibility with
+    ReplicationHandler and may cause replication to not work correctly.
+    See SOLR-1366 for details. <indexReaderFactory
+    name="IndexReaderFactory" class="package.class"> Parameters as
+    required by the implementation </indexReaderFactory >
+  -->
+  <!-- To set the termInfosIndexDivisor, do this: -->
+  <!--
+    <indexReaderFactory name="IndexReaderFactory"
+    class="org.apache.solr.core.StandardIndexReaderFactory"> <int
+    name="setTermIndexDivisor">12</int> </indexReaderFactory >
+  -->
+
+
+  <query>
+    <!--
+      Maximum number of clauses in a boolean query... in the past, this
+      affected range or prefix queries that expanded to big boolean
+      queries - built in Solr query parsers no longer create queries
+      with this limitation. An exception is thrown if exceeded.
+    -->
+    <maxBooleanClauses>1024</maxBooleanClauses>
+
+
+    <!--
+      There are two implementations of cache available for Solr,
+      LRUCache, based on a synchronized LinkedHashMap, and FastLRUCache,
+      based on a ConcurrentHashMap. FastLRUCache has faster gets and
+      slower puts in single threaded operation and thus is generally
+      faster than LRUCache when the hit ratio of the cache is high (>
+      75%), and may be faster under other scenarios on multi-cpu
+      systems.
+    -->
+    <!--
+      Cache used by SolrIndexSearcher for filters (DocSets), unordered
+      sets of *all* documents that match a query. When a new searcher is
+      opened, its caches may be prepopulated or "autowarmed" using data
+      from caches in the old searcher. autowarmCount is the number of
+      items to prepopulate. For LRUCache, the autowarmed items will be
+      the most recently accessed items. Parameters: class - the
+      SolrCache implementation LRUCache or FastLRUCache size - the
+      maximum number of entries in the cache initialSize - the initial
+      capacity (number of entries) of the cache. (seel
+      java.util.HashMap) autowarmCount - the number of entries to
+      prepopulate from and old cache.
+    -->
+    <filterCache class="solr.FastLRUCache" size="512"
+      initialSize="512" autowarmCount="0" />
+
+    <!--
+      Cache used to hold field values that are quickly accessible by
+      document id. The fieldValueCache is created by default even if not
+      configured here. <fieldValueCache class="solr.FastLRUCache"
+      size="512" autowarmCount="128" showItems="32" />
+    -->
+
+    <!--
+      queryResultCache caches results of searches - ordered lists of
+      document ids (DocList) based on a query, a sort, and the range of
+      documents requested.
+    -->
+    <queryResultCache class="solr.LRUCache" size="512"
+      initialSize="512" autowarmCount="0" />
+
+    <!--
+      documentCache caches Lucene Document objects (the stored fields
+      for each document). Since Lucene internal document ids are
+      transient, this cache will not be autowarmed.
+    -->
+    <documentCache class="solr.LRUCache" size="512"
+      initialSize="512" autowarmCount="0" />
+
+    <!--
+      If true, stored fields that are not requested will be loaded
+      lazily. This can result in a significant speed improvement if the
+      usual case is to not load all stored fields, especially if the
+      skipped fields are large compressed text fields.
+    -->
+    <enableLazyFieldLoading>true</enableLazyFieldLoading>
+
+    <!--
+      Example of a generic cache. These caches may be accessed by name
+      through SolrIndexSearcher.getCache(),cacheLookup(), and
+      cacheInsert(). The purpose is to enable easy caching of
+      user/application level data. The regenerator argument should be
+      specified as an implementation of solr.search.CacheRegenerator if
+      autowarming is desired.
+    -->
+    <!--
+      <cache name="myUserCache" class="solr.LRUCache" size="4096"
+      initialSize="1024" autowarmCount="1024"
+      regenerator="org.mycompany.mypackage.MyRegenerator" />
+    -->
+
+    <!--
+      An optimization that attempts to use a filter to satisfy a search.
+      If the requested sort does not include score, then the filterCache
+      will be checked for a filter matching the query. If found, the
+      filter will be used as the source of document ids, and then the
+      sort will be applied to that.
+      <useFilterForSortedQuery>true</useFilterForSortedQuery>
+    -->
+
+    <!--
+      An optimization for use with the queryResultCache. When a search
+      is requested, a superset of the requested number of document ids
+      are collected. For example, if a search for a particular query
+      requests matching documents 10 through 19, and queryWindowSize is
+      50, then documents 0 through 49 will be collected and cached. Any
+      further requests in that range can be satisfied via the cache.
+    -->
+    <queryResultWindowSize>20</queryResultWindowSize>
+
+    <!--
+      Maximum number of documents to cache for any entry in the
+      queryResultCache.
+    -->
+    <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
+
+    <!--
+      a newSearcher event is fired whenever a new searcher is being
+      prepared and there is a current searcher handling requests (aka
+      registered). It can be used to prime certain caches to prevent
+      long request times for certain requests.
+    -->
+    <!--
+      QuerySenderListener takes an array of NamedList and executes a
+      local query request for each NamedList in sequence.
+    -->
+    <listener event="newSearcher" class="solr.QuerySenderListener">
+      <arr name="queries">
+        <!--
+          <lst> <str name="q">solr</str> <str name="start">0</str> <str
+          name="rows">10</str> </lst> <lst> <str name="q">rocks</str>
+          <str name="start">0</str> <str name="rows">10</str> </lst>
+          <lst><str name="q">static newSearcher warming query from
+          solrconfig.xml</str></lst>
+        -->
+      </arr>
+    </listener>
+
+    <!--
+      a firstSearcher event is fired whenever a new searcher is being
+      prepared but there is no current registered searcher to handle
+      requests or to gain autowarming data from.
+    -->
+    <listener event="firstSearcher" class="solr.QuerySenderListener">
+      <arr name="queries">
+        <lst>
+          <str name="q">solr rocks</str>
+          <str name="start">0</str>
+          <str name="rows">10</str>
+        </lst>
+        <lst>
+          <str name="q">static firstSearcher warming query from
+            solrconfig.xml</str>
+        </lst>
+      </arr>
+    </listener>
+
+    <!--
+      If a search request comes in and there is no current registered
+      searcher, then immediately register the still warming searcher and
+      use it. If "false" then all requests will block until the first
+      searcher is done warming.
+    -->
+    <useColdSearcher>false</useColdSearcher>
+
+    <!--
+      Maximum number of searchers that may be warming in the background
+      concurrently. An error is returned if this limit is exceeded.
+      Recommend 1-2 for read-only slaves, higher for masters w/o cache
+      warming.
+    -->
+    <maxWarmingSearchers>2</maxWarmingSearchers>
+
+  </query>
+
+  <!--
+    Let the dispatch filter handler /select?qt=XXX handleSelect=true
+    will use consistent error handling for /select and /update
+    handleSelect=false will use solr1.1 style error formatting
+  -->
+  <requestDispatcher handleSelect="true">
+    <!--
+      Make sure your system has some authentication before enabling
+      remote streaming!
+    -->
+    <requestParsers enableRemoteStreaming="true"
+      multipartUploadLimitInKB="2048000" />
+
+    <!--
+      Set HTTP caching related parameters (for proxy caches and
+      clients). To get the behaviour of Solr 1.2 (ie: no caching related
+      headers) use the never304="true" option and do not specify a value
+      for <cacheControl>
+    -->
+    <!-- <httpCaching never304="true"> -->
+    <httpCaching lastModifiedFrom="openTime" etagSeed="Solr">
+      <!--
+        lastModFrom="openTime" is the default, the Last-Modified value
+        (and validation against If-Modified-Since requests) will all be
+        relative to when the current Searcher was opened. You can change
+        it to lastModFrom="dirLastMod" if you want the value to exactly
+        corrispond to when the physical index was last modified.
+
+        etagSeed="..." is an option you can change to force the ETag
+        header (and validation against If-None-Match requests) to be
+        differnet even if the index has not changed (ie: when making
+        significant changes to your config file) lastModifiedFrom and
+        etagSeed are both ignored if you use the never304="true" option.
+      -->
+      <!--
+        If you include a <cacheControl> directive, it will be used to
+        generate a Cache-Control header, as well as an Expires header if
+        the value contains "max-age=" By default, no Cache-Control
+        header is generated. You can use the <cacheControl> option even
+        if you have set never304="true"
+      -->
+      <!-- <cacheControl>max-age=30, public</cacheControl> -->
+    </httpCaching>
+  </requestDispatcher>
+
+
+  <!--
+    requestHandler plugins... incoming queries will be dispatched to the
+    correct handler based on the path or the qt (query type) param.
+    Names starting with a '/' are accessed with the a path equal to the
+    registered name. Names without a leading '/' are accessed with:
+    http://host/app/select?qt=name If no qt is defined, the
+    requestHandler that declares default="true" will be used.
+  -->
+  <requestHandler name="standard" class="solr.SearchHandler"
+    default="true">
+    <!-- default values for query parameters -->
+    <lst name="defaults">
+      <str name="echoParams">explicit</str>
+      <!--
+        <int name="rows">10</int> <str name="fl">*</str> <str
+        name="version">2.1</str>
+      -->
+    </lst>
+  </requestHandler>
+
+  <!--
+    Please refer to http://wiki.apache.org/solr/SolrReplication for
+    details on configuring replication
+  -->
+  <!-- remove the <lst name="master"> section if this is just a slave -->
+  <!-- remove  the <lst name="slave"> section if this is just a master -->
+  <!--
+    <requestHandler name="/replication" class="solr.ReplicationHandler"
+    > <lst name="master"> <str name="replicateAfter">commit</str> <str
+    name="replicateAfter">startup</str> <str
+    name="confFiles">schema.xml,stopwords.txt</str> </lst> <lst
+    name="slave"> <str
+    name="masterUrl">http://localhost:8983/solr/replication</str> <str
+    name="pollInterval">00:00:60</str> </lst> </requestHandler>
+  -->
+
+  <!--
+    DisMaxRequestHandler allows easy searching across multiple fields
+    for simple user-entered phrases. It's implementation is now just the
+    standard SearchHandler with a default query type of "dismax". see
+    http://wiki.apache.org/solr/DisMaxRequestHandler
+  -->
+  <requestHandler name="dismax" class="solr.SearchHandler">
+    <lst name="defaults">
+      <str name="defType">dismax</str>
+      <str name="echoParams">explicit</str>
+      <float name="tie">0.01</float>
+      <str name="qf">
+        text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0
+        manu^1.1 cat^1.4
+     </str>
+      <str name="pf">
+        text^0.2 features^1.1 name^1.5 manu^1.4
+        manu_exact^1.9
+     </str>
+      <str name="bf">
+        popularity^0.5 recip(price,1,1000,1000)^0.3
+     </str>
+      <str name="fl">
+        id,name,price,score
+     </str>
+      <str name="mm">
+        2&lt;-1 5&lt;-2 6&lt;90% </str>
+      <int name="ps">100</int>
+      <str name="q.alt">*:*</str>
+      <!-- example highlighter config, enable per-query with hl=true -->
+      <str name="hl.fl">text features name</str>
+      <!-- for this field, we want no fragmenting, just highlighting -->
+      <str name="f.name.hl.fragsize">0</str>
+      <!--
+        instructs Solr to return the field itself if no query terms are
+        found
+      -->
+      <str name="f.name.hl.alternateField">name</str>
+      <str name="f.text.hl.fragmenter">regex</str> <!-- defined below -->
+    </lst>
+  </requestHandler>
+
+  <!--
+    Note how you can register the same handler multiple times with
+    different names (and different init parameters)
+  -->
+  <requestHandler name="partitioned" class="solr.SearchHandler">
+    <lst name="defaults">
+      <str name="defType">dismax</str>
+      <str name="echoParams">explicit</str>
+      <str name="qf">text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0</str>
+      <str name="mm">2&lt;-1 5&lt;-2 6&lt;90%</str>
+      <!--
+        This is an example of using Date Math to specify a constantly
+        moving date range in a config...
+      -->
+      <str name="bq">incubationdate_dt:[* TO NOW/DAY-1MONTH]^2.2</str>
+    </lst>
+    <!--
+      In addition to defaults, "appends" params can be specified to
+      identify values which should be appended to the list of multi-val
+      params from the query (or the existing "defaults"). In this
+      example, the param "fq=instock:true" will be appended to any query
+      time fq params the user may specify, as a mechanism for
+      partitioning the index, independent of any user selected filtering
+      that may also be desired (perhaps as a result of faceted
+      searching). NOTE: there is *absolutely* nothing a client can do to
+      prevent these "appends" values from being used, so don't use this
+      mechanism unless you are sure you always want it.
+    -->
+    <lst name="appends">
+      <str name="fq">inStock:true</str>
+    </lst>
+    <!--
+      "invariants" are a way of letting the Solr maintainer lock down
+      the options available to Solr clients. Any params values specified
+      here are used regardless of what values may be specified in either
+      the query, the "defaults", or the "appends" params. In this
+      example, the facet.field and facet.query params are fixed,
+      limiting the facets clients can use. Faceting is not turned on by
+      default - but if the client does specify facet=true in the
+      request, these are the only facets they will be able to see counts
+      for; regardless of what other facet.field or facet.query params
+      they may specify. NOTE: there is *absolutely* nothing a client can
+      do to prevent these "invariants" values from being used, so don't
+      use this mechanism unless you are sure you always want it.
+    -->
+    <lst name="invariants">
+      <str name="facet.field">cat</str>
+      <str name="facet.field">manu_exact</str>
+      <str name="facet.query">price:[* TO 500]</str>
+      <str name="facet.query">price:[500 TO *]</str>
+    </lst>
+  </requestHandler>
+
+
+  <!--
+    Search components are registered to SolrCore and used by Search
+    Handlers By default, the following components are avaliable:
+
+    <searchComponent name="query"
+    class="org.apache.solr.handler.component.QueryComponent" />
+    <searchComponent name="facet"
+    class="org.apache.solr.handler.component.FacetComponent" />
+    <searchComponent name="mlt"
+    class="org.apache.solr.handler.component.MoreLikeThisComponent" />
+    <searchComponent name="highlight"
+    class="org.apache.solr.handler.component.HighlightComponent" />
+    <searchComponent name="stats"
+    class="org.apache.solr.handler.component.StatsComponent" />
+    <searchComponent name="debug"
+    class="org.apache.solr.handler.component.DebugComponent" /> Default
+    configuration in a requestHandler would look like: <arr
+    name="components"> <str>query</str> <str>facet</str> <str>mlt</str>
+    <str>highlight</str> <str>stats</str> <str>debug</str> </arr> If you
+    register a searchComponent to one of the standard names, that will
+    be used instead. To insert components before or after the 'standard'
+    components, use: <arr name="first-components">
+    <str>myFirstComponentName</str> </arr> <arr name="last-components">
+    <str>myLastComponentName</str> </arr>
+  -->
+
+  <!--
+    The spell check component can return a list of alternative spelling
+    suggestions.
+  -->
+  <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
+
+    <str name="queryAnalyzerFieldType">textSpell</str>
+
+    <lst name="spellchecker">
+      <str name="name">default</str>
+      <str name="field">name</str>
+      <str name="spellcheckIndexDir">./spellchecker</str>
+    </lst>
+
+    <!--
+      a spellchecker that uses a different distance measure <lst
+      name="spellchecker"> <str name="name">jarowinkler</str> <str
+      name="field">spell</str> <str
+      name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>
+      <str name="spellcheckIndexDir">./spellchecker2</str> </lst>
+    -->
+
+    <!--
+      a file based spell checker <lst name="spellchecker"> <str
+      name="classname">solr.FileBasedSpellChecker</str> <str
+      name="name">file</str> <str
+      name="sourceLocation">spellings.txt</str> <str
+      name="characterEncoding">UTF-8</str> <str
+      name="spellcheckIndexDir">./spellcheckerFile</str> </lst>
+    -->
+  </searchComponent>
+
+  <!--
+    A request handler utilizing the spellcheck component.
+    #############################################################################
+    NOTE: This is purely as an example. The whole purpose of the
+    SpellCheckComponent is to hook it into the request handler that
+    handles (i.e. the standard or dismax SearchHandler) queries such
+    that a separate request is not needed to get suggestions. IN OTHER
+    WORDS, THERE IS REALLY GOOD CHANCE THE SETUP BELOW IS NOT WHAT YOU
+    WANT FOR YOUR PRODUCTION SYSTEM!
+    #############################################################################
+  -->
+  <requestHandler name="/spell" class="solr.SearchHandler"
+    lazy="true">
+    <lst name="defaults">
+      <!-- omp = Only More Popular -->
+      <str name="spellcheck.onlyMorePopular">false</str>
+      <!-- exr = Extended Results -->
+      <str name="spellcheck.extendedResults">false</str>
+      <!--  The number of suggestions to return -->
+      <str name="spellcheck.count">1</str>
+    </lst>
+    <arr name="last-components">
+      <str>spellcheck</str>
+    </arr>
+  </requestHandler>
+
+  <searchComponent name="tvComponent"
+    class="org.apache.solr.handler.component.TermVectorComponent" />
+  <!--
+    A Req Handler for working with the tvComponent. This is purely as an
+    example. You will likely want to add the component to your already
+    specified request handlers.
+  -->
+  <requestHandler name="tvrh"
+    class="org.apache.solr.handler.component.SearchHandler">
+    <lst name="defaults">
+      <bool name="tv">true</bool>
+    </lst>
+    <arr name="last-components">
+      <str>tvComponent</str>
+    </arr>
+  </requestHandler>
+
+  <!--
+    Clustering Component http://wiki.apache.org/solr/ClusteringComponent
+    This relies on third party jars which are not included in the
+    release. To use this component (and the "/clustering" handler) Those
+    jars will need to be downloaded, and you'll need to set the
+    solr.cluster.enabled system property when running solr... java
+    -Dsolr.clustering.enabled=true -jar start.jar
+  -->
+  <searchComponent name="clusteringComponent"
+    enable="${solr.clustering.enabled:false}" class="org.apache.solr.handler.clustering.ClusteringComponent">
+    <!-- Declare an engine -->
+    <lst name="engine">
+      <!-- The name, only one can be named "default" -->
+      <str name="name">default</str>
+      <!--
+        Class name of Carrot2 clustering algorithm. Currently available
+        algorithms are: *
+        org.carrot2.clustering.lingo.LingoClusteringAlgorithm *
+        org.carrot2.clustering.stc.STCClusteringAlgorithm See
+        http://project.carrot2.org/algorithms.html for the algorithm's
+        characteristics.
+      -->
+      <str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>
+      <!--
+        Overriding values for Carrot2 default algorithm attributes. For
+        a description of all available attributes, see:
+        http://download.carrot2.org/stable/manual/#chapter.components.
+        Use attribute key as name attribute of str elements below. These
+        can be further overridden for individual requests by specifying
+        attribute key as request parameter name and attribute value as
+        parameter value.
+      -->
+      <str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>
+    </lst>
+    <lst name="engine">
+      <str name="name">stc</str>
+      <str name="carrot.algorithm">org.carrot2.clustering.stc.STCClusteringAlgorithm</str>
+    </lst>
+  </searchComponent>
+  <requestHandler name="/clustering" enable="${solr.clustering.enabled:false}"
+    class="solr.SearchHandler">
+    <lst name="defaults">
+      <bool name="clustering">true</bool>
+      <str name="clustering.engine">default</str>
+      <bool name="clustering.results">true</bool>
+      <!-- The title field -->
+      <str name="carrot.title">name</str>
+      <str name="carrot.url">id</str>
+      <!-- The field to cluster on -->
+      <str name="carrot.snippet">features</str>
+      <!-- produce summaries -->
+      <bool name="carrot.produceSummary">true</bool>
+      <!-- the maximum number of labels per cluster -->
+      <!--<int name="carrot.numDescriptions">5</int>-->
+      <!-- produce sub clusters -->
+      <bool name="carrot.outputSubClusters">false</bool>
+    </lst>
+    <arr name="last-components">
+      <str>clusteringComponent</str>
+    </arr>
+  </requestHandler>
+
+  <!-- Solr Cell: http://wiki.apache.org/solr/ExtractingRequestHandler -->
+  <requestHandler name="/update/extract"
+    class="org.apache.solr.handler.extraction.ExtractingRequestHandler"
+    startup="lazy">
+    <lst name="defaults">
+      <!--
+        All the main content goes into "text"... if you need to return
+        the extracted text or do highlighting, use a stored field.
+      -->
+      <str name="fmap.content">text</str>
+      <str name="lowernames">true</str>
+      <str name="uprefix">ignored_</str>
+
+      <!-- capture link hrefs but ignore div attributes -->
+      <str name="captureAttr">true</str>
+      <str name="fmap.a">links</str>
+      <str name="fmap.div">ignored_</str>
+    </lst>
+  </requestHandler>
+
+
+  <!--
+    A component to return terms and document frequency of those terms.
+    This component does not yet support distributed search.
+  -->
+  <searchComponent name="termsComponent"
+    class="org.apache.solr.handler.component.TermsComponent" />
+
+  <requestHandler name="/terms"
+    class="org.apache.solr.handler.component.SearchHandler">
+    <lst name="defaults">
+      <bool name="terms">true</bool>
+    </lst>
+    <arr name="components">
+      <str>termsComponent</str>
+    </arr>
+  </requestHandler>
+
+
+
+
+  <!--
+    Update request handler. Note: Since solr1.1 requestHandlers requires
+    a valid content type header if posted in the body. For example, curl
+    now requires: -H 'Content-type:text/xml; charset=utf-8' The response
+    format differs from solr1.1 formatting and returns a standard error
+    code. To enable solr1.1 behavior, remove the /update handler or
+    change its path
+  -->
+  <requestHandler name="/update" class="solr.XmlUpdateRequestHandler"/>
+
+  <requestHandler name="/update/javabin" class="solr.BinaryUpdateRequestHandler" />
+
+  <!--
+    Analysis request handler. Since Solr 1.3. Use to return how a
+    document is analyzed. Useful for debugging and as a token server for
+    other types of applications. This is deprecated in favor of the
+    improved DocumentAnalysisRequestHandler and
+    FieldAnalysisRequestHandler <requestHandler name="/analysis"
+    class="solr.AnalysisRequestHandler" />
+  -->
+
+  <!--
+    An analysis handler that provides a breakdown of the analysis
+    process of provided docuemnts. This handler expects a (single)
+    content stream with the following format: <docs> <doc> <field
+    name="id">1</field> <field name="name">The Name</field> <field
+    name="text">The Text Value</field> <doc> <doc>...</doc>
+    <doc>...</doc> ... </docs> Note: Each document must contain a field
+    which serves as the unique key. This key is used in the returned
+    response to assoicate an analysis breakdown to the analyzed
+    document. Like the FieldAnalysisRequestHandler, this handler also
+    supports query analysis by sending either an "analysis.query" or "q"
+    request paraemter that holds the query text to be analyized. It also
+    supports the "analysis.showmatch" parameter which when set to true,
+    all field tokens that match the query tokens will be marked as a
+    "match".
+  -->
+  <requestHandler name="/analysis/document"
+    class="solr.DocumentAnalysisRequestHandler" />
+
+  <!--
+    RequestHandler that provides much the same functionality as
+    analysis.jsp. Provides the ability to specify multiple field types
+    and field names in the same request and outputs index-time and
+    query-time analysis for each of them. Request parameters are:
+    analysis.fieldname - The field name whose analyzers are to be used
+    analysis.fieldtype - The field type whose analyzers are to be used
+    analysis.fieldvalue - The text for index-time analysis q (or
+    analysis.q) - The text for query time analysis analysis.showmatch
+    (true|false) - When set to true and when query analysis is
+    performed, the produced tokens of the field value analysis will be
+    marked as "matched" for every token that is produces by the query
+    analysis
+  -->
+  <requestHandler name="/analysis/field" class="solr.FieldAnalysisRequestHandler" />
+
+
+  <!-- CSV update handler, loaded on demand -->
+  <requestHandler name="/update/csv" class="solr.CSVRequestHandler"
+    startup="lazy" />
+
+
+  <!--
+    Admin Handlers - This will register all the standard admin
+    RequestHandlers. Adding this single handler is equivalent to
+    registering: <requestHandler name="/admin/luke"
+    class="org.apache.solr.handler.admin.LukeRequestHandler" />
+    <requestHandler name="/admin/system"
+    class="org.apache.solr.handler.admin.SystemInfoHandler" />
+    <requestHandler name="/admin/plugins"
+    class="org.apache.solr.handler.admin.PluginInfoHandler" />
+    <requestHandler name="/admin/threads"
+    class="org.apache.solr.handler.admin.ThreadDumpHandler" />
+    <requestHandler name="/admin/properties"
+    class="org.apache.solr.handler.admin.PropertiesRequestHandler" />
+    <requestHandler name="/admin/file"
+    class="org.apache.solr.handler.admin.ShowFileRequestHandler" > If
+    you wish to hide files under ${solr.home}/conf, explicitly register
+    the ShowFileRequestHandler using: <requestHandler name="/admin/file"
+    class="org.apache.solr.handler.admin.ShowFileRequestHandler" > <lst
+    name="invariants"> <str name="hidden">synonyms.txt</str> <str
+    name="hidden">anotherfile.txt</str> </lst> </requestHandler>
+  -->
+  <requestHandler name="/admin/"
+    class="org.apache.solr.handler.admin.AdminHandlers" />
+
+  <!-- Echo the request contents back to the client -->
+  <requestHandler name="/debug/dump" class="solr.DumpRequestHandler">
+    <lst name="defaults">
+      <str name="echoParams">explicit</str> <!-- for all params (including the default etc) use: 'all' -->
+      <str name="echoHandler">true</str>
+    </lst>
+  </requestHandler>
+
+  <!--
+    An example dedup update processor that creates the "id" field on the
+    fly based on the hash code of some other fields. This example has
+    overwriteDupes set to false since we are using the id field as the
+    signatureField and Solr will maintain uniqueness based on that
+    anyway. You have to link the chain to an update handler above to use
+    it ie: <requestHandler name="/update
+    "class="solr.XmlUpdateRequestHandler"> <lst name="defaults"> <str
+    name="update.chain">dedupe</str> </lst> </requestHandler>
+  -->
+
+
+  <!--
+    queryResponseWriter plugins... query responses will be written using
+    the writer specified by the 'wt' request parameter matching the name
+    of a registered writer. The "default" writer is the default and will
+    be used if 'wt' is not specified in the request. XMLResponseWriter
+    will be used if nothing is specified here. The json, python, and
+    ruby writers are also available by default. <queryResponseWriter
+    name="xml" class="org.apache.solr.request.XMLResponseWriter"
+    default="true"/> <queryResponseWriter name="json"
+    class="org.apache.solr.request.JSONResponseWriter"/>
+    <queryResponseWriter name="python"
+    class="org.apache.solr.request.PythonResponseWriter"/>
+    <queryResponseWriter name="ruby"
+    class="org.apache.solr.request.RubyResponseWriter"/>
+    <queryResponseWriter name="php"
+    class="org.apache.solr.request.PHPResponseWriter"/>
+    <queryResponseWriter name="phps"
+    class="org.apache.solr.request.PHPSerializedResponseWriter"/>
+
+    <queryResponseWriter name="custom"
+    class="com.example.MyResponseWriter"/>
+  -->
+
+  <!--
+    XSLT response writer transforms the XML output by any xslt file
+    found in Solr's conf/xslt directory. Changes to xslt files are
+    checked for every xsltCacheLifetimeSeconds.
+  -->
+  <queryResponseWriter name="xslt"
+    class="org.apache.solr.response.XSLTResponseWriter">
+    <int name="xsltCacheLifetimeSeconds">5</int>
+  </queryResponseWriter>
+
+
+  <!--
+    example of registering a query parser <queryParser name="lucene"
+    class="org.apache.solr.search.LuceneQParserPlugin"/>
+  -->
+
+  <!--
+    example of registering a custom function parser <valueSourceParser
+    name="myfunc" class="com.mycompany.MyValueSourceParser" />
+  -->
+
+  <!-- config for the admin interface -->
+  <admin>
+    <defaultQuery>*</defaultQuery>
+
+    <!--
+      configure a healthcheck file for servers behind a loadbalancer
+      <healthcheck type="file">server-enabled</healthcheck>
+    -->
+  </admin>
+
+</config>

Added: lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactoryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactoryTest.java?rev=1295330&view=auto
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactoryTest.java (added)
+++ lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMAAnnotationsTokenizerFactoryTest.java Wed Feb 29 22:43:12 2012
@@ -0,0 +1,49 @@
+package org.apache.solr.uima.analysis;
+
+/*
+ * 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.
+ */
+
+import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.request.SolrQueryRequest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ */
+public class UIMAAnnotationsTokenizerFactoryTest extends SolrTestCaseJ4 {
+
+  @BeforeClass
+  public static void beforeClass() throws Exception {
+    initCore("uima/uima-tokenizers-solrconfig.xml", "uima/uima-tokenizers-schema.xml");
+  }
+
+  @Test
+  public void testInitialization() throws Exception {
+    assertNotNull(h.getCore().getSchema().getField("sentences"));
+    assertNotNull(h.getCore().getSchema().getFieldType("sentences"));
+  }
+
+  @Test
+  public void testIndexAndQuery() throws Exception {
+    assertU("<add><doc><field name=\"id\">123</field><field name=\"text\">One and 1 is two. Instead One or 1 is 0.</field></doc></add>");
+    assertU(commit());
+    SolrQueryRequest req = req("qt", "/terms", "terms.fl", "sentences");
+    assertQ(req, "//lst[@name='sentences']/int[@name='One and 1 is two.']");
+    assertQ(req, "//lst[@name='sentences']/int[@name=' Instead One or 1 is 0.']");
+    req.close();
+  }
+}