a15771596a3cc714f08842345a6a4bdfcaa98fde
[lui-solr.git] / zookeeper / example-schemaless / solr / collection1 / conf / schema.xml
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!--
3  Licensed to the Apache Software Foundation (ASF) under one or more
4  contributor license agreements.  See the NOTICE file distributed with
5  this work for additional information regarding copyright ownership.
6  The ASF licenses this file to You under the Apache License, Version 2.0
7  (the "License"); you may not use this file except in compliance with
8  the License.  You may obtain a copy of the License at
9
10      http://www.apache.org/licenses/LICENSE-2.0
11
12  Unless required by applicable law or agreed to in writing, software
13  distributed under the License is distributed on an "AS IS" BASIS,
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  See the License for the specific language governing permissions and
16  limitations under the License.
17 -->
18
19 <!--  
20  This is the Solr schema file. This file should be named "schema.xml" and
21  should be in the conf directory under the solr home
22  (i.e. ./solr/conf/schema.xml by default) 
23  or located where the classloader for the Solr webapp can find it.
24
25  This example schema is the recommended starting point for users.
26  It should be kept correct and concise, usable out-of-the-box.
27
28  For more information, on how to customize this file, please see
29  http://wiki.apache.org/solr/SchemaXml
30
31  PERFORMANCE NOTE: this schema includes many optional features and should not
32  be used for benchmarking.  To improve performance one could
33   - set stored="false" for all fields possible (esp large fields) when you
34     only need to search on the field but don't need to return the original
35     value.
36   - set indexed="false" if you don't need to search on the field, but only
37     return the field as a result of searching on other indexed fields.
38   - remove all unneeded copyField statements
39   - for best index size and searching performance, set "index" to false
40     for all general text fields, use copyField to copy them to the
41     catchall "text" field, and use that for searching.
42   - For maximum indexing performance, use the StreamingUpdateSolrServer
43     java client.
44   - Remember to run the JVM in server mode, and use a higher logging level
45     that avoids logging every request
46 -->
47
48 <schema name="example-schemaless" version="1.5">
49   <!-- attribute "name" is the name of this schema and is only used for display purposes.
50        version="x.y" is Solr's version number for the schema syntax and 
51        semantics.  It should not normally be changed by applications.
52
53        1.0: multiValued attribute did not exist, all fields are multiValued 
54             by nature
55        1.1: multiValued attribute introduced, false by default 
56        1.2: omitTermFreqAndPositions attribute introduced, true by default 
57             except for text fields.
58        1.3: removed optional field compress feature
59        1.4: autoGeneratePhraseQueries attribute introduced to drive QueryParser
60             behavior when a single string produces multiple tokens.  Defaults 
61             to off for version >= 1.4
62        1.5: omitNorms defaults to true for primitive field types 
63             (int, float, boolean, string...)
64      -->
65
66   <fields>
67     <!-- Valid attributes for fields:
68      name: mandatory - the name for the field
69      type: mandatory - the name of a field type from the 
70        <types> fieldType section
71      indexed: true if this field should be indexed (searchable or sortable)
72      stored: true if this field should be retrievable
73      docValues: true if this field should have doc values. Doc values are
74        useful for faceting, grouping, sorting and function queries. Although not
75        required, doc values will make the index faster to load, more
76        NRT-friendly and more memory-efficient. They however come with some
77        limitations: they are currently only supported by StrField, UUIDField
78        and all Trie*Fields, and depending on the field type, they might
79        require the field to be single-valued, be required or have a default
80        value (check the documentation of the field type you're interested in
81        for more information)
82      multiValued: true if this field may contain multiple values per document
83      omitNorms: (expert) set to true to omit the norms associated with
84        this field (this disables length normalization and index-time
85        boosting for the field, and saves some memory).  Only full-text
86        fields or fields that need an index-time boost need norms.
87        Norms are omitted for primitive (non-analyzed) types by default.
88      termVectors: [false] set to true to store the term vector for a
89        given field.
90        When using MoreLikeThis, fields used for similarity should be
91        stored for best performance.
92      termPositions: Store position information with the term vector.  
93        This will increase storage costs.
94      termOffsets: Store offset information with the term vector. This 
95        will increase storage costs.
96      required: The field is required.  It will throw an error if the
97        value does not exist
98      default: a value that should be used if no value is specified
99        when adding a document.
100    -->
101
102     <!-- field names should consist of alphanumeric or underscore characters only and
103       not start with a digit.  This is not currently strictly enforced,
104       but other field names will not have first class support from all components
105       and back compatibility is not guaranteed.  Names with both leading and
106       trailing underscores (e.g. _version_) are reserved.
107    -->
108
109     <!-- In this "schemaless" example, only two fields are pre-declared: id and _version_.
110          All other fields will be type guessed and added via the
111          "add-unknown-fields-to-the-schema" update request processor chain declared 
112          in solrconfig.xml.
113       -->
114     <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
115     <field name="_version_" type="long" indexed="true" stored="true"/>
116
117
118     <!-- Dynamic field definitions allow using convention over configuration
119        for fields via the specification of patterns to match field names. 
120        EXAMPLE:  name="*_i" will match any field ending in _i (like myid_i, z_i)
121        RESTRICTION: the glob-like pattern in the name attribute must have
122        a "*" only at the start or the end.  -->
123    
124     <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
125     <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
126     <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
127     <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>
128     <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
129     <dynamicField name="*_ls" type="long"   indexed="true"  stored="true"  multiValued="true"/>
130     <dynamicField name="*_t"  type="text_general"    indexed="true"  stored="true"/>
131     <dynamicField name="*_txt" type="text_general"   indexed="true"  stored="true" multiValued="true"/>
132     <dynamicField name="*_en"  type="text_en"    indexed="true"  stored="true" multiValued="true"/>
133     <dynamicField name="*_b"  type="boolean" indexed="true" stored="true"/>
134     <dynamicField name="*_bs" type="boolean" indexed="true" stored="true"  multiValued="true"/>
135     <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
136     <dynamicField name="*_fs" type="float"  indexed="true"  stored="true"  multiValued="true"/>
137     <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
138     <dynamicField name="*_ds" type="double" indexed="true"  stored="true"  multiValued="true"/>
139
140     <!-- Type used to index the lat and lon components for the "location" FieldType -->
141     <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false" />
142
143     <dynamicField name="*_dt"  type="date"    indexed="true"  stored="true"/>
144     <dynamicField name="*_dts" type="date"    indexed="true"  stored="true" multiValued="true"/>
145     <dynamicField name="*_p"  type="location" indexed="true" stored="true"/>
146
147     <!-- some trie-coded dynamic fields for faster range queries -->
148     <dynamicField name="*_ti" type="tint"    indexed="true"  stored="true"/>
149     <dynamicField name="*_tl" type="tlong"   indexed="true"  stored="true"/>
150     <dynamicField name="*_tf" type="tfloat"  indexed="true"  stored="true"/>
151     <dynamicField name="*_td" type="tdouble" indexed="true"  stored="true"/>
152     <dynamicField name="*_tdt" type="tdate"  indexed="true"  stored="true"/>
153
154     <dynamicField name="*_pi"  type="pint"    indexed="true"  stored="true"/>
155     <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>
156
157     <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
158     <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>
159
160     <dynamicField name="random_*" type="random" />
161
162     <!-- uncomment the following to ignore any fields that don't already match an existing 
163         field name or dynamic field, rather than reporting them as an error. 
164         alternately, change the type="ignored" to some other type e.g. "text" if you want 
165         unknown fields indexed and/or stored by default 
166         
167         NB: use of "*" dynamic fields will disable field type guessing and adding
168         unknown fields to the schema. --> 
169     <!--dynamicField name="*" type="ignored" multiValued="true" /-->
170    
171   </fields>
172
173
174   <!-- Field to use to determine and enforce document uniqueness. 
175       Unless this field is marked with required="false", it will be a required field
176    -->
177   <uniqueKey>id</uniqueKey>
178
179   <!-- DEPRECATED: The defaultSearchField is consulted by various query parsers when
180   parsing a query string that isn't explicit about the field.  Machine (non-user)
181   generated queries are best made explicit, or they can use the "df" request parameter
182   which takes precedence over this.
183   Note: Un-commenting defaultSearchField will be insufficient if your request handler
184   in solrconfig.xml defines "df", which takes precedence. That would need to be removed.
185  <defaultSearchField>text</defaultSearchField> -->
186
187   <!-- DEPRECATED: The defaultOperator (AND|OR) is consulted by various query parsers
188   when parsing a query string to determine if a clause of the query should be marked as
189   required or optional, assuming the clause isn't already marked by some operator.
190   The default is OR, which is generally assumed so it is not a good idea to change it
191   globally here.  The "q.op" request parameter takes precedence over this.
192  <solrQueryParser defaultOperator="OR"/> -->
193
194   <!-- copyField commands copy one field to another at the time a document
195         is added to the index.  It's used either to index the same field differently,
196         or to add multiple fields to the same field for easier/faster searching.
197
198    <copyField source="cat" dest="text"/>
199    <copyField source="name" dest="text"/>
200    <copyField source="manu" dest="text"/>
201    <copyField source="features" dest="text"/>
202    <copyField source="includes" dest="text"/>
203    <copyField source="manu" dest="manu_exact"/>
204    -->
205
206   <!-- Copy the price into a currency enabled field (default USD)
207    <copyField source="price" dest="price_c"/>
208    -->
209
210   <!-- Text fields from SolrCell to search by default in our catch-all field
211    <copyField source="title" dest="text"/>
212    <copyField source="author" dest="text"/>
213    <copyField source="description" dest="text"/>
214    <copyField source="keywords" dest="text"/>
215    <copyField source="content" dest="text"/>
216    <copyField source="content_type" dest="text"/>
217    <copyField source="resourcename" dest="text"/>
218    <copyField source="url" dest="text"/>
219    -->
220
221   <!-- Create a string version of author for faceting
222    <copyField source="author" dest="author_s"/>
223    -->
224         
225   <!-- Above, multiple source fields are copied to the [text] field. 
226           Another way to map multiple source fields to the same 
227           destination field is to use the dynamic field syntax. 
228           copyField also supports a maxChars to copy setting.  -->
229            
230   <!-- <copyField source="*_t" dest="text" maxChars="3000"/> -->
231
232   <!-- copy name to alphaNameSort, a field designed for sorting by name -->
233   <!-- <copyField source="name" dest="alphaNameSort"/> -->
234  
235   <types>
236     <!-- field type definitions. The "name" attribute is
237        just a label to be used by field definitions.  The "class"
238        attribute and any other attributes determine the real
239        behavior of the fieldType.
240          Class names starting with "solr" refer to java classes in a
241        standard package such as org.apache.solr.analysis
242     -->
243
244     <!-- The StrField type is not analyzed, but indexed/stored verbatim.
245        It supports doc values but in that case the field needs to be
246        single-valued and either required or have a default value.
247       -->
248     <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
249
250     <!-- boolean type: "true" or "false" -->
251     <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
252
253     <fieldType name="booleans" class="solr.BoolField" sortMissingLast="true" multiValued="true"/>
254
255     <!-- sortMissingLast and sortMissingFirst attributes are optional attributes are
256          currently supported on types that are sorted internally as strings
257          and on numeric types.
258              This includes "string","boolean", and, as of 3.5 (and 4.x),
259              int, float, long, date, double, including the "Trie" variants.
260        - If sortMissingLast="true", then a sort on this field will cause documents
261          without the field to come after documents with the field,
262          regardless of the requested sort order (asc or desc).
263        - If sortMissingFirst="true", then a sort on this field will cause documents
264          without the field to come before documents with the field,
265          regardless of the requested sort order.
266        - If sortMissingLast="false" and sortMissingFirst="false" (the default),
267          then default lucene sorting will be used which places docs without the
268          field first in an ascending sort and last in a descending sort.
269     -->    
270
271     <!--
272       Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
273
274       These fields support doc values, but they require the field to be
275       single-valued and either be required or have a default value.
276     -->
277     <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
278     <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
279     <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
280     <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
281
282     <!--
283      Numeric field types that index each value at various levels of precision
284      to accelerate range queries when the number of values between the range
285      endpoints is large. See the javadoc for NumericRangeQuery for internal
286      implementation details.
287
288      Smaller precisionStep values (specified in bits) will lead to more tokens
289      indexed per value, slightly larger index size, and faster range queries.
290      A precisionStep of 0 disables indexing at different precision levels.
291     -->
292     <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
293     <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
294     <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
295     <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
296     
297     <fieldType name="tints" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
298     <fieldType name="tfloats" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
299     <fieldType name="tlongs" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
300     <fieldType name="tdoubles" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
301
302     <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
303          is a more restricted form of the canonical representation of dateTime
304          http://www.w3.org/TR/xmlschema-2/#dateTime    
305          The trailing "Z" designates UTC time and is mandatory.
306          Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
307          All other components are mandatory.
308
309          Expressions can also be used to denote calculations that should be
310          performed relative to "NOW" to determine the value, ie...
311
312                NOW/HOUR
313                   ... Round to the start of the current hour
314                NOW-1DAY
315                   ... Exactly 1 day prior to now
316                NOW/DAY+6MONTHS+3DAYS
317                   ... 6 months and 3 days in the future from the start of
318                       the current day
319                       
320          Consult the DateField javadocs for more information.
321
322          Note: For faster range queries, consider the tdate type
323       -->
324     <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
325
326     <!-- A Trie based date field for faster date range queries and date faceting. -->
327     <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
328
329     <fieldType name="tdates" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0" multiValued="true"/>
330
331
332     <!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
333     <fieldtype name="binary" class="solr.BinaryField"/>
334
335     <!--
336       Note:
337       These should only be used for compatibility with existing indexes (created with lucene or older Solr versions).
338       Use Trie based fields instead. As of Solr 3.5 and 4.x, Trie based fields support sortMissingFirst/Last
339       
340       Plain numeric field types that store and index the text
341       value verbatim (and hence don't correctly support range queries, since the
342       lexicographic ordering isn't equal to the numeric ordering)
343     -->
344     <fieldType name="pint" class="solr.IntField"/>
345     <fieldType name="plong" class="solr.LongField"/>
346     <fieldType name="pfloat" class="solr.FloatField"/>
347     <fieldType name="pdouble" class="solr.DoubleField"/>
348     <fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>
349
350     <!-- The "RandomSortField" is not used to store or search any
351          data.  You can declare fields of this type it in your schema
352          to generate pseudo-random orderings of your docs for sorting 
353          or function purposes.  The ordering is generated based on the field
354          name and the version of the index. As long as the index version
355          remains unchanged, and the same field name is reused,
356          the ordering of the docs will be consistent.  
357          If you want different psuedo-random orderings of documents,
358          for the same version of the index, use a dynamicField and
359          change the field name in the request.
360      -->
361     <fieldType name="random" class="solr.RandomSortField" indexed="true" />
362
363     <!-- solr.TextField allows the specification of custom text analyzers
364          specified as a tokenizer and a list of token filters. Different
365          analyzers may be specified for indexing and querying.
366
367          The optional positionIncrementGap puts space between multiple fields of
368          this type on the same document, with the purpose of preventing false phrase
369          matching across fields.
370
371          For more info on customizing your analyzer chain, please see
372          http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
373      -->
374
375     <!-- One can also specify an existing Analyzer class that has a
376          default constructor via the class attribute on the analyzer element.
377          Example:
378     <fieldType name="text_greek" class="solr.TextField">
379       <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
380     </fieldType>
381     -->
382
383     <!-- A text field that only splits on whitespace for exact matching of words -->
384     <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
385       <analyzer>
386         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
387       </analyzer>
388     </fieldType>
389
390     <!-- A general text field that has reasonable, generic
391          cross-language defaults: it tokenizes with StandardTokenizer,
392          removes stop words from case-insensitive "stopwords.txt"
393          (empty by default), and down cases.  At query time only, it
394          also applies synonyms. -->
395     <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
396       <analyzer type="index">
397         <tokenizer class="solr.StandardTokenizerFactory"/>
398         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
399         <!-- in this example, we will only use synonyms at query time
400         <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
401         -->
402         <filter class="solr.LowerCaseFilterFactory"/>
403       </analyzer>
404       <analyzer type="query">
405         <tokenizer class="solr.StandardTokenizerFactory"/>
406         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
407         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
408         <filter class="solr.LowerCaseFilterFactory"/>
409       </analyzer>
410     </fieldType>
411
412     <!-- A text field with defaults appropriate for English: it
413          tokenizes with StandardTokenizer, removes English stop words
414          (lang/stopwords_en.txt), down cases, protects words from protwords.txt, and
415          finally applies Porter's stemming.  The query time analyzer
416          also applies synonyms from synonyms.txt. -->
417     <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
418       <analyzer type="index">
419         <tokenizer class="solr.StandardTokenizerFactory"/>
420         <!-- in this example, we will only use synonyms at query time
421         <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
422         -->
423         <!-- Case insensitive stop word removal.
424         -->
425         <filter class="solr.StopFilterFactory"
426                 ignoreCase="true"
427                 words="lang/stopwords_en.txt"
428             />
429         <filter class="solr.LowerCaseFilterFactory"/>
430         <filter class="solr.EnglishPossessiveFilterFactory"/>
431         <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
432         <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
433         <filter class="solr.EnglishMinimalStemFilterFactory"/>
434         -->
435         <filter class="solr.PorterStemFilterFactory"/>
436       </analyzer>
437       <analyzer type="query">
438         <tokenizer class="solr.StandardTokenizerFactory"/>
439         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
440         <filter class="solr.StopFilterFactory"
441                 ignoreCase="true"
442                 words="lang/stopwords_en.txt"
443             />
444         <filter class="solr.LowerCaseFilterFactory"/>
445         <filter class="solr.EnglishPossessiveFilterFactory"/>
446         <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
447         <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
448         <filter class="solr.EnglishMinimalStemFilterFactory"/>
449         -->
450         <filter class="solr.PorterStemFilterFactory"/>
451       </analyzer>
452     </fieldType>
453
454     <!-- A text field with defaults appropriate for English, plus
455          aggressive word-splitting and autophrase features enabled.
456          This field is just like text_en, except it adds
457          WordDelimiterFilter to enable splitting and matching of
458          words on case-change, alpha numeric boundaries, and
459          non-alphanumeric chars.  This means certain compound word
460          cases will work, for example query "wi fi" will match
461          document "WiFi" or "wi-fi".
462         -->
463     <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
464       <analyzer type="index">
465         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
466         <!-- in this example, we will only use synonyms at query time
467         <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
468         -->
469         <!-- Case insensitive stop word removal.
470         -->
471         <filter class="solr.StopFilterFactory"
472                 ignoreCase="true"
473                 words="lang/stopwords_en.txt"
474             />
475         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
476         <filter class="solr.LowerCaseFilterFactory"/>
477         <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
478         <filter class="solr.PorterStemFilterFactory"/>
479       </analyzer>
480       <analyzer type="query">
481         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
482         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
483         <filter class="solr.StopFilterFactory"
484                 ignoreCase="true"
485                 words="lang/stopwords_en.txt"
486             />
487         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
488         <filter class="solr.LowerCaseFilterFactory"/>
489         <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
490         <filter class="solr.PorterStemFilterFactory"/>
491       </analyzer>
492     </fieldType>
493
494     <!-- Less flexible matching, but less false matches.  Probably not ideal for product names,
495          but may be good for SKUs.  Can insert dashes in the wrong place and still match. -->
496     <fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
497       <analyzer>
498         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
499         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
500         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
501         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
502         <filter class="solr.LowerCaseFilterFactory"/>
503         <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
504         <filter class="solr.EnglishMinimalStemFilterFactory"/>
505         <!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
506              possible with WordDelimiterFilter in conjuncton with stemming. -->
507         <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
508       </analyzer>
509     </fieldType>
510
511     <!-- Just like text_general except it reverses the characters of
512          each token, to enable more efficient leading wildcard queries. -->
513     <fieldType name="text_general_rev" class="solr.TextField" positionIncrementGap="100">
514       <analyzer type="index">
515         <tokenizer class="solr.StandardTokenizerFactory"/>
516         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
517         <filter class="solr.LowerCaseFilterFactory"/>
518         <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
519                 maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
520       </analyzer>
521       <analyzer type="query">
522         <tokenizer class="solr.StandardTokenizerFactory"/>
523         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
524         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
525         <filter class="solr.LowerCaseFilterFactory"/>
526       </analyzer>
527     </fieldType>
528
529     <!-- charFilter + WhitespaceTokenizer  -->
530     <!--
531     <fieldType name="text_char_norm" class="solr.TextField" positionIncrementGap="100" >
532       <analyzer>
533         <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
534         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
535       </analyzer>
536     </fieldType>
537     -->
538
539     <!-- This is an example of using the KeywordTokenizer along
540          With various TokenFilterFactories to produce a sortable field
541          that does not include some properties of the source text
542       -->
543     <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
544       <analyzer>
545         <!-- KeywordTokenizer does no actual tokenizing, so the entire
546              input string is preserved as a single token
547           -->
548         <tokenizer class="solr.KeywordTokenizerFactory"/>
549         <!-- The LowerCase TokenFilter does what you expect, which can be
550              when you want your sorting to be case insensitive
551           -->
552         <filter class="solr.LowerCaseFilterFactory" />
553         <!-- The TrimFilter removes any leading or trailing whitespace -->
554         <filter class="solr.TrimFilterFactory" />
555         <!-- The PatternReplaceFilter gives you the flexibility to use
556              Java Regular expression to replace any sequence of characters
557              matching a pattern with an arbitrary replacement string, 
558              which may include back references to portions of the original
559              string matched by the pattern.
560              
561              See the Java Regular Expression documentation for more
562              information on pattern and replacement string syntax.
563              
564              http://docs.oracle.com/javase/7/docs/api/java/util/regex/package-summary.html
565           -->
566         <filter class="solr.PatternReplaceFilterFactory"
567                 pattern="([^a-z])" replacement="" replace="all"
568             />
569       </analyzer>
570     </fieldType>
571     
572     <fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField" >
573       <analyzer>
574         <tokenizer class="solr.StandardTokenizerFactory"/>
575         <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
576       </analyzer>
577     </fieldtype>
578
579     <fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField" >
580       <analyzer>
581         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
582         <!--
583         The DelimitedPayloadTokenFilter can put payloads on tokens... for example,
584         a token of "foo|1.4"  would be indexed as "foo" with a payload of 1.4f
585         Attributes of the DelimitedPayloadTokenFilterFactory : 
586          "delimiter" - a one character delimiter. Default is | (pipe)
587          "encoder" - how to encode the following value into a playload
588             float -> org.apache.lucene.analysis.payloads.FloatEncoder,
589             integer -> o.a.l.a.p.IntegerEncoder
590             identity -> o.a.l.a.p.IdentityEncoder
591             Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor.
592          -->
593         <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/>
594       </analyzer>
595     </fieldtype>
596
597     <!-- lowercases the entire field value, keeping it as a single token.  -->
598     <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
599       <analyzer>
600         <tokenizer class="solr.KeywordTokenizerFactory"/>
601         <filter class="solr.LowerCaseFilterFactory" />
602       </analyzer>
603     </fieldType>
604
605     <!-- 
606       Example of using PathHierarchyTokenizerFactory at index time, so
607       queries for paths match documents at that path, or in descendent paths
608     -->
609     <fieldType name="descendent_path" class="solr.TextField">
610       <analyzer type="index">
611         <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
612       </analyzer>
613       <analyzer type="query">
614         <tokenizer class="solr.KeywordTokenizerFactory" />
615       </analyzer>
616     </fieldType>
617     <!-- 
618       Example of using PathHierarchyTokenizerFactory at query time, so
619       queries for paths match documents at that path, or in ancestor paths
620     -->
621     <fieldType name="ancestor_path" class="solr.TextField">
622       <analyzer type="index">
623         <tokenizer class="solr.KeywordTokenizerFactory" />
624       </analyzer>
625       <analyzer type="query">
626         <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
627       </analyzer>
628     </fieldType>
629
630     <!-- since fields of this type are by default not stored or indexed,
631          any data added to them will be ignored outright.  --> 
632     <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />
633
634     <!-- This point type indexes the coordinates as separate fields (subFields)
635       If subFieldType is defined, it references a type, and a dynamic field
636       definition is created matching *___<typename>.  Alternately, if 
637       subFieldSuffix is defined, that is used to create the subFields.
638       Example: if subFieldType="double", then the coordinates would be
639         indexed in fields myloc_0___double,myloc_1___double.
640       Example: if subFieldSuffix="_d" then the coordinates would be indexed
641         in fields myloc_0_d,myloc_1_d
642       The subFields are an implementation detail of the fieldType, and end
643       users normally should not need to know about them.
644      -->
645     <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
646
647     <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
648     <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
649
650     <!-- An alternative geospatial field type new to Solr 4.  It supports multiValued and polygon shapes.
651       For more information about this and other Spatial fields new to Solr 4, see:
652       http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
653     -->
654     <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
655                geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees" />
656
657     <!-- Money/currency field type. See http://wiki.apache.org/solr/MoneyFieldType
658         Parameters:
659           defaultCurrency: Specifies the default currency if none specified. Defaults to "USD"
660           precisionStep:   Specifies the precisionStep for the TrieLong field used for the amount
661           providerClass:   Lets you plug in other exchange provider backend:
662                            solr.FileExchangeRateProvider is the default and takes one parameter:
663                              currencyConfig: name of an xml file holding exchange rates
664                            solr.OpenExchangeRatesOrgProvider uses rates from openexchangerates.org:
665                              ratesFileLocation: URL or path to rates JSON file (default latest.json on the web)
666                              refreshInterval: Number of minutes between each rates fetch (default: 1440, min: 60)
667    -->
668     <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD" currencyConfig="currency.xml" />
669              
670
671
672     <!-- some examples for different languages (generally ordered by ISO code) -->
673
674     <!-- Arabic -->
675     <fieldType name="text_ar" class="solr.TextField" positionIncrementGap="100">
676       <analyzer> 
677         <tokenizer class="solr.StandardTokenizerFactory"/>
678         <!-- for any non-arabic -->
679         <filter class="solr.LowerCaseFilterFactory"/>
680         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ar.txt" />
681         <!-- normalizes ﻯ to ﻱ, etc -->
682         <filter class="solr.ArabicNormalizationFilterFactory"/>
683         <filter class="solr.ArabicStemFilterFactory"/>
684       </analyzer>
685     </fieldType>
686
687     <!-- Bulgarian -->
688     <fieldType name="text_bg" class="solr.TextField" positionIncrementGap="100">
689       <analyzer> 
690         <tokenizer class="solr.StandardTokenizerFactory"/> 
691         <filter class="solr.LowerCaseFilterFactory"/>
692         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_bg.txt" /> 
693         <filter class="solr.BulgarianStemFilterFactory"/>       
694       </analyzer>
695     </fieldType>
696     
697     <!-- Catalan -->
698     <fieldType name="text_ca" class="solr.TextField" positionIncrementGap="100">
699       <analyzer> 
700         <tokenizer class="solr.StandardTokenizerFactory"/>
701         <!-- removes l', etc -->
702         <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_ca.txt"/>
703         <filter class="solr.LowerCaseFilterFactory"/>
704         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ca.txt" />
705         <filter class="solr.SnowballPorterFilterFactory" language="Catalan"/>       
706       </analyzer>
707     </fieldType>
708     
709     <!-- CJK bigram (see text_ja for a Japanese configuration using morphological analysis) -->
710     <fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">
711       <analyzer>
712         <tokenizer class="solr.StandardTokenizerFactory"/>
713         <!-- normalize width before bigram, as e.g. half-width dakuten combine  -->
714         <filter class="solr.CJKWidthFilterFactory"/>
715         <!-- for any non-CJK -->
716         <filter class="solr.LowerCaseFilterFactory"/>
717         <filter class="solr.CJKBigramFilterFactory"/>
718       </analyzer>
719     </fieldType>
720
721     <!-- Czech -->
722     <fieldType name="text_cz" class="solr.TextField" positionIncrementGap="100">
723       <analyzer> 
724         <tokenizer class="solr.StandardTokenizerFactory"/>
725         <filter class="solr.LowerCaseFilterFactory"/>
726         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_cz.txt" />
727         <filter class="solr.CzechStemFilterFactory"/>       
728       </analyzer>
729     </fieldType>
730     
731     <!-- Danish -->
732     <fieldType name="text_da" class="solr.TextField" positionIncrementGap="100">
733       <analyzer> 
734         <tokenizer class="solr.StandardTokenizerFactory"/>
735         <filter class="solr.LowerCaseFilterFactory"/>
736         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_da.txt" format="snowball" />
737         <filter class="solr.SnowballPorterFilterFactory" language="Danish"/>       
738       </analyzer>
739     </fieldType>
740     
741     <!-- German -->
742     <fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
743       <analyzer> 
744         <tokenizer class="solr.StandardTokenizerFactory"/>
745         <filter class="solr.LowerCaseFilterFactory"/>
746         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" />
747         <filter class="solr.GermanNormalizationFilterFactory"/>
748         <filter class="solr.GermanLightStemFilterFactory"/>
749         <!-- less aggressive: <filter class="solr.GermanMinimalStemFilterFactory"/> -->
750         <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="German2"/> -->
751       </analyzer>
752     </fieldType>
753     
754     <!-- Greek -->
755     <fieldType name="text_el" class="solr.TextField" positionIncrementGap="100">
756       <analyzer> 
757         <tokenizer class="solr.StandardTokenizerFactory"/>
758         <!-- greek specific lowercase for sigma -->
759         <filter class="solr.GreekLowerCaseFilterFactory"/>
760         <filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_el.txt" />
761         <filter class="solr.GreekStemFilterFactory"/>
762       </analyzer>
763     </fieldType>
764     
765     <!-- Spanish -->
766     <fieldType name="text_es" class="solr.TextField" positionIncrementGap="100">
767       <analyzer> 
768         <tokenizer class="solr.StandardTokenizerFactory"/>
769         <filter class="solr.LowerCaseFilterFactory"/>
770         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" />
771         <filter class="solr.SpanishLightStemFilterFactory"/>
772         <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Spanish"/> -->
773       </analyzer>
774     </fieldType>
775     
776     <!-- Basque -->
777     <fieldType name="text_eu" class="solr.TextField" positionIncrementGap="100">
778       <analyzer> 
779         <tokenizer class="solr.StandardTokenizerFactory"/>
780         <filter class="solr.LowerCaseFilterFactory"/>
781         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_eu.txt" />
782         <filter class="solr.SnowballPorterFilterFactory" language="Basque"/>
783       </analyzer>
784     </fieldType>
785     
786     <!-- Persian -->
787     <fieldType name="text_fa" class="solr.TextField" positionIncrementGap="100">
788       <analyzer>
789         <!-- for ZWNJ -->
790         <charFilter class="solr.PersianCharFilterFactory"/>
791         <tokenizer class="solr.StandardTokenizerFactory"/>
792         <filter class="solr.LowerCaseFilterFactory"/>
793         <filter class="solr.ArabicNormalizationFilterFactory"/>
794         <filter class="solr.PersianNormalizationFilterFactory"/>
795         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fa.txt" />
796       </analyzer>
797     </fieldType>
798     
799     <!-- Finnish -->
800     <fieldType name="text_fi" class="solr.TextField" positionIncrementGap="100">
801       <analyzer> 
802         <tokenizer class="solr.StandardTokenizerFactory"/>
803         <filter class="solr.LowerCaseFilterFactory"/>
804         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fi.txt" format="snowball" />
805         <filter class="solr.SnowballPorterFilterFactory" language="Finnish"/>
806         <!-- less aggressive: <filter class="solr.FinnishLightStemFilterFactory"/> -->
807       </analyzer>
808     </fieldType>
809     
810     <!-- French -->
811     <fieldType name="text_fr" class="solr.TextField" positionIncrementGap="100">
812       <analyzer> 
813         <tokenizer class="solr.StandardTokenizerFactory"/>
814         <!-- removes l', etc -->
815         <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_fr.txt"/>
816         <filter class="solr.LowerCaseFilterFactory"/>
817         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fr.txt" format="snowball" />
818         <filter class="solr.FrenchLightStemFilterFactory"/>
819         <!-- less aggressive: <filter class="solr.FrenchMinimalStemFilterFactory"/> -->
820         <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="French"/> -->
821       </analyzer>
822     </fieldType>
823     
824     <!-- Irish -->
825     <fieldType name="text_ga" class="solr.TextField" positionIncrementGap="100">
826       <analyzer> 
827         <tokenizer class="solr.StandardTokenizerFactory"/>
828         <!-- removes d', etc -->
829         <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_ga.txt"/>
830         <!-- removes n-, etc. position increments is intentionally false! -->
831         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/hyphenations_ga.txt"/>
832         <filter class="solr.IrishLowerCaseFilterFactory"/>
833         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ga.txt"/>
834         <filter class="solr.SnowballPorterFilterFactory" language="Irish"/>
835       </analyzer>
836     </fieldType>
837     
838     <!-- Galician -->
839     <fieldType name="text_gl" class="solr.TextField" positionIncrementGap="100">
840       <analyzer> 
841         <tokenizer class="solr.StandardTokenizerFactory"/>
842         <filter class="solr.LowerCaseFilterFactory"/>
843         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_gl.txt" />
844         <filter class="solr.GalicianStemFilterFactory"/>
845         <!-- less aggressive: <filter class="solr.GalicianMinimalStemFilterFactory"/> -->
846       </analyzer>
847     </fieldType>
848     
849     <!-- Hindi -->
850     <fieldType name="text_hi" class="solr.TextField" positionIncrementGap="100">
851       <analyzer> 
852         <tokenizer class="solr.StandardTokenizerFactory"/>
853         <filter class="solr.LowerCaseFilterFactory"/>
854         <!-- normalizes unicode representation -->
855         <filter class="solr.IndicNormalizationFilterFactory"/>
856         <!-- normalizes variation in spelling -->
857         <filter class="solr.HindiNormalizationFilterFactory"/>
858         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hi.txt" />
859         <filter class="solr.HindiStemFilterFactory"/>
860       </analyzer>
861     </fieldType>
862     
863     <!-- Hungarian -->
864     <fieldType name="text_hu" class="solr.TextField" positionIncrementGap="100">
865       <analyzer> 
866         <tokenizer class="solr.StandardTokenizerFactory"/>
867         <filter class="solr.LowerCaseFilterFactory"/>
868         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hu.txt" format="snowball" />
869         <filter class="solr.SnowballPorterFilterFactory" language="Hungarian"/>
870         <!-- less aggressive: <filter class="solr.HungarianLightStemFilterFactory"/> -->   
871       </analyzer>
872     </fieldType>
873     
874     <!-- Armenian -->
875     <fieldType name="text_hy" class="solr.TextField" positionIncrementGap="100">
876       <analyzer> 
877         <tokenizer class="solr.StandardTokenizerFactory"/>
878         <filter class="solr.LowerCaseFilterFactory"/>
879         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hy.txt" />
880         <filter class="solr.SnowballPorterFilterFactory" language="Armenian"/>
881       </analyzer>
882     </fieldType>
883     
884     <!-- Indonesian -->
885     <fieldType name="text_id" class="solr.TextField" positionIncrementGap="100">
886       <analyzer> 
887         <tokenizer class="solr.StandardTokenizerFactory"/>
888         <filter class="solr.LowerCaseFilterFactory"/>
889         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_id.txt" />
890         <!-- for a less aggressive approach (only inflectional suffixes), set stemDerivational to false -->
891         <filter class="solr.IndonesianStemFilterFactory" stemDerivational="true"/>
892       </analyzer>
893     </fieldType>
894     
895     <!-- Italian -->
896     <fieldType name="text_it" class="solr.TextField" positionIncrementGap="100">
897       <analyzer> 
898         <tokenizer class="solr.StandardTokenizerFactory"/>
899         <!-- removes l', etc -->
900         <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_it.txt"/>
901         <filter class="solr.LowerCaseFilterFactory"/>
902         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_it.txt" format="snowball" />
903         <filter class="solr.ItalianLightStemFilterFactory"/>
904         <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Italian"/> -->
905       </analyzer>
906     </fieldType>
907     
908     <!-- Japanese using morphological analysis (see text_cjk for a configuration using bigramming)
909
910          NOTE: If you want to optimize search for precision, use default operator AND in your query
911          parser config with <solrQueryParser defaultOperator="AND"/> further down in this file.  Use 
912          OR if you would like to optimize for recall (default).
913     -->
914     <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
915       <analyzer>
916         <!-- Kuromoji Japanese morphological analyzer/tokenizer (JapaneseTokenizer)
917
918            Kuromoji has a search mode (default) that does segmentation useful for search.  A heuristic
919            is used to segment compounds into its parts and the compound itself is kept as synonym.
920
921            Valid values for attribute mode are:
922               normal: regular segmentation
923               search: segmentation useful for search with synonyms compounds (default)
924             extended: same as search mode, but unigrams unknown words (experimental)
925
926            For some applications it might be good to use search mode for indexing and normal mode for
927            queries to reduce recall and prevent parts of compounds from being matched and highlighted.
928            Use <analyzer type="index"> and <analyzer type="query"> for this and mode normal in query.
929
930            Kuromoji also has a convenient user dictionary feature that allows overriding the statistical
931            model with your own entries for segmentation, part-of-speech tags and readings without a need
932            to specify weights.  Notice that user dictionaries have not been subject to extensive testing.
933
934            User dictionary attributes are:
935                      userDictionary: user dictionary filename
936              userDictionaryEncoding: user dictionary encoding (default is UTF-8)
937
938            See lang/userdict_ja.txt for a sample user dictionary file.
939
940            Punctuation characters are discarded by default.  Use discardPunctuation="false" to keep them.
941
942            See http://wiki.apache.org/solr/JapaneseLanguageSupport for more on Japanese language support.
943         -->
944         <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
945         <!--<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>-->
946         <!-- Reduces inflected verbs and adjectives to their base/dictionary forms (辞書形) -->
947         <filter class="solr.JapaneseBaseFormFilterFactory"/>
948         <!-- Removes tokens with certain part-of-speech tags -->
949         <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" />
950         <!-- Normalizes full-width romaji to half-width and half-width kana to full-width (Unicode NFKC subset) -->
951         <filter class="solr.CJKWidthFilterFactory"/>
952         <!-- Removes common tokens typically not useful for search, but have a negative effect on ranking -->
953         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" />
954         <!-- Normalizes common katakana spelling variations by removing any last long sound character (U+30FC) -->
955         <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
956         <!-- Lower-cases romaji characters -->
957         <filter class="solr.LowerCaseFilterFactory"/>
958       </analyzer>
959     </fieldType>
960     
961     <!-- Latvian -->
962     <fieldType name="text_lv" class="solr.TextField" positionIncrementGap="100">
963       <analyzer> 
964         <tokenizer class="solr.StandardTokenizerFactory"/>
965         <filter class="solr.LowerCaseFilterFactory"/>
966         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_lv.txt" />
967         <filter class="solr.LatvianStemFilterFactory"/>
968       </analyzer>
969     </fieldType>
970     
971     <!-- Dutch -->
972     <fieldType name="text_nl" class="solr.TextField" positionIncrementGap="100">
973       <analyzer> 
974         <tokenizer class="solr.StandardTokenizerFactory"/>
975         <filter class="solr.LowerCaseFilterFactory"/>
976         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_nl.txt" format="snowball" />
977         <filter class="solr.StemmerOverrideFilterFactory" dictionary="lang/stemdict_nl.txt" ignoreCase="false"/>
978         <filter class="solr.SnowballPorterFilterFactory" language="Dutch"/>
979       </analyzer>
980     </fieldType>
981     
982     <!-- Norwegian -->
983     <fieldType name="text_no" class="solr.TextField" positionIncrementGap="100">
984       <analyzer> 
985         <tokenizer class="solr.StandardTokenizerFactory"/>
986         <filter class="solr.LowerCaseFilterFactory"/>
987         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_no.txt" format="snowball" />
988         <filter class="solr.SnowballPorterFilterFactory" language="Norwegian"/>
989         <!-- less aggressive: <filter class="solr.NorwegianLightStemFilterFactory"/> -->
990         <!-- singular/plural: <filter class="solr.NorwegianMinimalStemFilterFactory"/> -->
991       </analyzer>
992     </fieldType>
993     
994     <!-- Portuguese -->
995     <fieldType name="text_pt" class="solr.TextField" positionIncrementGap="100">
996       <analyzer> 
997         <tokenizer class="solr.StandardTokenizerFactory"/>
998         <filter class="solr.LowerCaseFilterFactory"/>
999         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" />
1000         <filter class="solr.PortugueseLightStemFilterFactory"/>
1001         <!-- less aggressive: <filter class="solr.PortugueseMinimalStemFilterFactory"/> -->
1002         <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/> -->
1003         <!-- most aggressive: <filter class="solr.PortugueseStemFilterFactory"/> -->
1004       </analyzer>
1005     </fieldType>
1006     
1007     <!-- Romanian -->
1008     <fieldType name="text_ro" class="solr.TextField" positionIncrementGap="100">
1009       <analyzer> 
1010         <tokenizer class="solr.StandardTokenizerFactory"/>
1011         <filter class="solr.LowerCaseFilterFactory"/>
1012         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ro.txt" />
1013         <filter class="solr.SnowballPorterFilterFactory" language="Romanian"/>
1014       </analyzer>
1015     </fieldType>
1016     
1017     <!-- Russian -->
1018     <fieldType name="text_ru" class="solr.TextField" positionIncrementGap="100">
1019       <analyzer> 
1020         <tokenizer class="solr.StandardTokenizerFactory"/>
1021         <filter class="solr.LowerCaseFilterFactory"/>
1022         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt" format="snowball" />
1023         <filter class="solr.SnowballPorterFilterFactory" language="Russian"/>
1024         <!-- less aggressive: <filter class="solr.RussianLightStemFilterFactory"/> -->
1025       </analyzer>
1026     </fieldType>
1027     
1028     <!-- Swedish -->
1029     <fieldType name="text_sv" class="solr.TextField" positionIncrementGap="100">
1030       <analyzer> 
1031         <tokenizer class="solr.StandardTokenizerFactory"/>
1032         <filter class="solr.LowerCaseFilterFactory"/>
1033         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_sv.txt" format="snowball" />
1034         <filter class="solr.SnowballPorterFilterFactory" language="Swedish"/>
1035         <!-- less aggressive: <filter class="solr.SwedishLightStemFilterFactory"/> -->
1036       </analyzer>
1037     </fieldType>
1038     
1039     <!-- Thai -->
1040     <fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">
1041       <analyzer> 
1042         <tokenizer class="solr.StandardTokenizerFactory"/>
1043         <filter class="solr.LowerCaseFilterFactory"/>
1044         <filter class="solr.ThaiWordFilterFactory"/>
1045         <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt" />
1046       </analyzer>
1047     </fieldType>
1048     
1049     <!-- Turkish -->
1050     <fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">
1051       <analyzer> 
1052         <tokenizer class="solr.StandardTokenizerFactory"/>
1053         <filter class="solr.TurkishLowerCaseFilterFactory"/>
1054         <filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_tr.txt" />
1055         <filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>
1056       </analyzer>
1057     </fieldType>
1058
1059   </types>
1060   
1061   <!-- Similarity is the scoring routine for each document vs. a query.
1062        A custom Similarity or SimilarityFactory may be specified here, but 
1063        the default is fine for most applications.  
1064        For more info: http://wiki.apache.org/solr/SchemaXml#Similarity
1065     -->
1066   <!--
1067      <similarity class="com.example.solr.CustomSimilarityFactory">
1068        <str name="paramkey">param value</str>
1069      </similarity>
1070     -->
1071
1072 </schema>