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