Project

General

Profile

1
<?xml version="1.0" encoding="UTF-8" ?>
2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3
	<xsl:output omit-xml-declaration="yes" indent="yes"/>
4

    
5
	<xsl:template match="/FIELDS">
6

    
7
		<xsl:param name="textFieldType" select="string('text_common')"/>
8
		<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'"/>
9
		<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
10

    
11
		<!--
12
		D-Net index schema template
13

    
14
		CHANGELOG
15

    
16
		0.1 : first release
17
		0.2 : added preserveOriginal="1" for text field type in the index analyzer and catenateWords="1" for the query analyzer
18
		0.3 : changed language for SnowballPorterFilterFactory to language="German2" (index/query) in the text field type
19
		0.4 : added solr.ASCIIFoldingFilterFactory filter (index/query) in the text field type
20
		0.5 : added long_keyword field type, to be used for objIdentifiers
21
		0.6 : added field types for spellchecking
22
		0.7 : added parameter for text field type
23
		0.8 : added field _version_, needed by Solr 4.0.0 for the transaction log
24
		0.9   : added type: text_en_splitting
25
		0.91  : added type: ngramtext
26
		0.92  : added schema optimizations, removing unnecessary stored fields
27
		0.93  : added attribute preserveOriginal="1" to fieldtype ngramtext (query analysis) to improve matches
28
		0.94  : updated and simplified ngramtext fieldtype
29
		0.95  : update to solr 4.4, removed attribute "compress" from field definition, ngramfield doesn't support NGramFilterFactory anymore
30
		0.96  : update to solr 4.9
31
		0.97  : introduced field type string_ci supporting case insensitivity.
32
		1.0   : updated to solr 6.6.0
33
		 -->
34
		<schema name="dnet" version="1.0">
35

    
36
			<!-- Valid attributes for fields:
37
			 name: mandatory - the name for the field
38
			 type: mandatory - the name of a field type from the
39
			   fieldTypes section
40
			 indexed: true if this field should be indexed (searchable or sortable)
41
			 stored: true if this field should be retrievable
42
			 docValues: true if this field should have doc values. Doc values are
43
			   useful (required, if you are using *Point fields) for faceting,
44
			   grouping, sorting and function queries. Doc values will make the index
45
			   faster to load, more NRT-friendly and more memory-efficient.
46
			   They however come with some limitations: they are currently only
47
			   supported by StrField, UUIDField, all Trie*Fields and *PointFields,
48
			   and depending on the field type, they might require the field to be
49
			   single-valued, be required or have a default value (check the
50
			   documentation of the field type you're interested in for more information)
51
			 multiValued: true if this field may contain multiple values per document
52
			 omitNorms: (expert) set to true to omit the norms associated with
53
			   this field (this disables length normalization and index-time
54
			   boosting for the field, and saves some memory).  Only full-text
55
			   fields or fields that need an index-time boost need norms.
56
			   Norms are omitted for primitive (non-analyzed) types by default.
57
			 termVectors: [false] set to true to store the term vector for a
58
			   given field.
59
			   When using MoreLikeThis, fields used for similarity should be
60
			   stored for best performance.
61
			 termPositions: Store position information with the term vector.
62
			   This will increase storage costs.
63
			 termOffsets: Store offset information with the term vector. This
64
			   will increase storage costs.
65
			 required: The field is required.  It will throw an error if the
66
			   value does not exist
67
			 default: a value that should be used if no value is specified
68
			   when adding a document.
69
			-->
70

    
71
			<!-- field names should consist of alphanumeric or underscore characters only and
72
			  not start with a digit.  This is not currently strictly enforced,
73
			  but other field names will not have first class support from all components
74
			  and back compatibility is not guaranteed.  Names with both leading and
75
			  trailing underscores (e.g. _version_) are reserved.
76
			-->
77

    
78
			<xsl:for-each select="./FIELD">
79
				<xsl:variable name="fieldname" select="translate(@name, $uppercase, $smallcase)"/>
80
				<xsl:variable name="fieldtype">
81
					<xsl:choose>
82
						<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
83
						<!-- this comment is here as a reference,
84
							once the MDFormat profile will be updated, remove the old type mappings
85

    
86
						<xsl:when test="@type='int'">pint</xsl:when>
87
						<xsl:when test="@type='date'">pdate</xsl:when>
88
						<xsl:when test="@type='ngramtext'">ngramtext</xsl:when>
89
						<xsl:when test="@type='string_ci'">string_ci</xsl:when>
90
						-->
91
						<xsl:when test="@tokenizable='false'">string</xsl:when>
92
						<xsl:otherwise>
93
							<xsl:value-of select="$textFieldType"/>
94
						</xsl:otherwise>
95
					</xsl:choose>
96
				</xsl:variable>
97
				<xsl:variable name="isMultivalued">
98
					<xsl:choose>
99
						<xsl:when test="@multivalued='false'">false</xsl:when>
100
						<xsl:otherwise>true</xsl:otherwise>
101
					</xsl:choose>
102
				</xsl:variable>
103
				<xsl:variable name="isStored">
104
					<xsl:choose>
105
						<xsl:when test="@stored='true'">true</xsl:when>
106
						<xsl:otherwise>false</xsl:otherwise>
107
					</xsl:choose>
108
				</xsl:variable>
109

    
110
				<field name="{$fieldname}" type="{$fieldtype}" indexed="{@indexable}" stored="{normalize-space($isStored)}" multiValued="{normalize-space($isMultivalued)}"/>
111
			</xsl:for-each>
112

    
113
			<field name="__indexrecordidentifier" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
114

    
115
			<field name="__deleted" type="boolean" indexed="true" stored="false" default="false" omitNorms="true" omitTermFreqAndPositions="true"/>
116

    
117
			<field name="__dsid" type="string" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
118

    
119
			<field name="__dsversion" type="pdate" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
120

    
121
			<field name="__result" type="string" indexed="false" stored="true" multiValued="false" docValues="false"/>
122

    
123
			<field name="__all" type="{$textFieldType}" indexed="true" stored="false" multiValued="true"/>
124

    
125
			<field name="_version_" type="long" indexed="true" stored="true" multiValued="false" />
126

    
127
			<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
128

    
129
			<!-- field for ping -->
130
			<field name="text" type="{$textFieldType}" indexed="false" stored="false"/>
131

    
132
			<!-- Field to use to determine and enforce document uniqueness.
133
				 Unless this field is marked with required="false", it will be a required field
134
			  -->
135
			<uniqueKey>__indexrecordidentifier</uniqueKey>
136

    
137
			<xsl:for-each select="./FIELD[(@type = 'ngramtext' or not(@type)) and not(@tokenizable = 'false')]">
138
				<xsl:variable name="fieldname" select="translate(@name, $uppercase, $smallcase)"/>
139
				<copyField source="{$fieldname}" dest="__all"/>
140
			</xsl:for-each>
141

    
142
			<!-- copyField commands copy one field to another at the time a document
143
			   is added to the index.  It's used either to index the same field differently,
144
			   or to add multiple fields to the same field for easier/faster searching.
145

    
146
			<copyField source="sourceFieldName" dest="destinationFieldName"/>
147
			-->
148

    
149
			<!-- field type definitions. The "name" attribute is
150
			   just a label to be used by field definitions.  The "class"
151
			   attribute and any other attributes determine the real
152
			   behavior of the fieldType.
153
				 Class names starting with "solr" refer to java classes in a
154
			   standard package such as org.apache.solr.analysis
155
			-->
156

    
157
			<!-- The StrField type is not analyzed, but indexed/stored verbatim.
158
			   It supports doc values but in that case the field needs to be
159
			   single-valued and either required or have a default value.
160
			  -->
161
			<fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true" />
162
			<fieldType name="strings" class="solr.StrField" sortMissingLast="true" multiValued="true" docValues="true" />
163

    
164
			<!-- boolean type: "true" or "false" -->
165
			<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
166

    
167
			<fieldType name="booleans" class="solr.BoolField" sortMissingLast="true" multiValued="true"/>
168

    
169
			<!-- sortMissingLast and sortMissingFirst attributes are optional attributes are
170
				 currently supported on types that are sorted internally as strings
171
				 and on numeric types.
172
				 This includes "string","boolean", "int", "float", "long", "date", "double",
173
				 including the "Trie" and "Point" variants.
174
			   - If sortMissingLast="true", then a sort on this field will cause documents
175
				 without the field to come after documents with the field,
176
				 regardless of the requested sort order (asc or desc).
177
			   - If sortMissingFirst="true", then a sort on this field will cause documents
178
				 without the field to come before documents with the field,
179
				 regardless of the requested sort order.
180
			   - If sortMissingLast="false" and sortMissingFirst="false" (the default),
181
				 then default lucene sorting will be used which places docs without the
182
				 field first in an ascending sort and last in a descending sort.
183
			-->
184

    
185
			<!--
186
			  Numeric field types that index values using KD-trees. *Point fields are faster and more efficient than Trie* fields both, at
187
			  search time and at index time, but some features are still not supported.
188
			  Point fields don't support FieldCache, so they must have docValues="true" if needed for sorting, faceting, functions, etc.
189
			-->
190
			<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
191
			<fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
192
			<fieldType name="plong" class="solr.LongPointField" docValues="true"/>
193
			<fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
194

    
195
			<fieldType name="pints" class="solr.IntPointField" docValues="true" multiValued="true"/>
196
			<fieldType name="pfloats" class="solr.FloatPointField" docValues="true" multiValued="true"/>
197
			<fieldType name="plongs" class="solr.LongPointField" docValues="true" multiValued="true"/>
198
			<fieldType name="pdoubles" class="solr.DoublePointField" docValues="true" multiValued="true"/>
199

    
200
			<!--
201
			  Default numeric field types. For faster range queries, consider *PointFields (pint/pfloat/plong/pdouble), or the
202
			  tint/tfloat/tlong/tdouble types.
203
			-->
204
			<fieldType name="int" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
205
			<fieldType name="float" class="solr.TrieFloatField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
206
			<fieldType name="long" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
207
			<fieldType name="double" class="solr.TrieDoubleField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
208

    
209
			<fieldType name="ints" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
210
			<fieldType name="floats" class="solr.TrieFloatField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
211
			<fieldType name="longs" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
212
			<fieldType name="doubles" class="solr.TrieDoubleField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
213

    
214
			<!--
215
			 Numeric field types that index each value at various levels of precision
216
			 to accelerate range queries when the number of values between the range
217
			 endpoints is large. See the javadoc for NumericRangeQuery for internal
218
			 implementation details.
219

    
220
			 Smaller precisionStep values (specified in bits) will lead to more tokens
221
			 indexed per value, slightly larger index size, and faster range queries.
222
			 A precisionStep of 0 disables indexing at different precision levels.
223

    
224
			 Consider using pint/pfloat/plong/pdouble instead of Trie* fields if possible
225
			-->
226
			<fieldType name="tint" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
227
			<fieldType name="tfloat" class="solr.TrieFloatField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
228
			<fieldType name="tlong" class="solr.TrieLongField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
229
			<fieldType name="tdouble" class="solr.TrieDoubleField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
230

    
231
			<fieldType name="tints" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
232
			<fieldType name="tfloats" class="solr.TrieFloatField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
233
			<fieldType name="tlongs" class="solr.TrieLongField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
234
			<fieldType name="tdoubles" class="solr.TrieDoubleField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
235

    
236
			<!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
237
				 is a more restricted form of the canonical representation of dateTime
238
				 http://www.w3.org/TR/xmlschema-2/#dateTime
239
				 The trailing "Z" designates UTC time and is mandatory.
240
				 Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
241
				 All other components are mandatory.
242

    
243
				 Expressions can also be used to denote calculations that should be
244
				 performed relative to "NOW" to determine the value, ie...
245

    
246
					   NOW/HOUR
247
						  ... Round to the start of the current hour
248
					   NOW-1DAY
249
						  ... Exactly 1 day prior to now
250
					   NOW/DAY+6MONTHS+3DAYS
251
						  ... 6 months and 3 days in the future from the start of
252
							  the current day
253

    
254
				 Consult the TrieDateField javadocs for more information.
255
			  -->
256
			<!-- KD-tree versions of date fields -->
257
			<fieldType name="pdate" class="solr.DatePointField" docValues="true"/>
258
			<fieldType name="pdates" class="solr.DatePointField" docValues="true" multiValued="true"/>
259

    
260
			<fieldType name="date" class="solr.TrieDateField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
261
			<fieldType name="dates" class="solr.TrieDateField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
262

    
263
			<fieldType name="tdate" class="solr.TrieDateField" docValues="true" precisionStep="6" positionIncrementGap="0"/>
264
			<fieldType name="tdates" class="solr.TrieDateField" docValues="true" precisionStep="6" positionIncrementGap="0" multiValued="true"/>
265

    
266

    
267
			<!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
268
			<fieldType name="binary" class="solr.BinaryField"/>
269

    
270
			<!-- The "RandomSortField" is not used to store or search any
271
				 data.  You can declare fields of this type it in your schema
272
				 to generate pseudo-random orderings of your docs for sorting
273
				 or function purposes.  The ordering is generated based on the field
274
				 name and the version of the index. As long as the index version
275
				 remains unchanged, and the same field name is reused,
276
				 the ordering of the docs will be consistent.
277
				 If you want different psuedo-random orderings of documents,
278
				 for the same version of the index, use a dynamicField and
279
				 change the field name in the request.
280
			 -->
281
			<fieldType name="random" class="solr.RandomSortField" indexed="true" />
282

    
283
			<!-- solr.TextField allows the specification of custom text analyzers
284
				 specified as a tokenizer and a list of token filters. Different
285
				 analyzers may be specified for indexing and querying.
286

    
287
				 The optional positionIncrementGap puts space between multiple fields of
288
				 this type on the same document, with the purpose of preventing false phrase
289
				 matching across fields.
290

    
291
				 For more info on customizing your analyzer chain, please see
292
				 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
293
			 -->
294

    
295
			<!-- One can also specify an existing Analyzer class that has a
296
				 default constructor via the class attribute on the analyzer element.
297
				 Example:
298
			<fieldType name="text_greek" class="solr.TextField">
299
			  <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
300
			</fieldType>
301
			-->
302

    
303
			<!-- A text field that only splits on whitespace for exact matching of words -->
304
			<!-- <dynamicField name="*_ws" type="text_ws"  indexed="true"  stored="true"/> -->
305

    
306
			<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
307
				<analyzer>
308
					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
309
				</analyzer>
310
			</fieldType>
311

    
312
			<fieldType name="ngramtext" class="solr.TextField">
313
				<analyzer type="index">
314
					<tokenizer class="solr.KeywordTokenizerFactory"/>
315
					<filter class="solr.LowerCaseFilterFactory"/>
316
					<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="25"/>
317
					<filter class="solr.TrimFilterFactory"/>
318
					<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
319
				</analyzer>
320
				<analyzer type="query">
321
					<tokenizer class="solr.KeywordTokenizerFactory"/>
322
					<filter class="solr.LowerCaseFilterFactory"/>
323
				</analyzer>
324
			</fieldType>
325

    
326

    
327
			<fieldType name="personName" class="solr.TextField"  positionIncrementGap="100">
328
				<analyzer>
329
					<tokenizer class="solr.StandardTokenizerFactory" />
330
					<filter class="solr.LowerCaseFilterFactory" />
331
				</analyzer>
332
			</fieldType>
333

    
334
			<fieldType name="personNamePrefix" class="solr.TextField"  positionIncrementGap="100">
335
				<analyzer type="index">
336
					<tokenizer class="solr.StandardTokenizerFactory"/>
337
					<filter class="solr.LowerCaseFilterFactory" />
338
					<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="30" />
339
				</analyzer>
340
				<analyzer type="query">
341
					<tokenizer class="solr.StandardTokenizerFactory"/>
342
					<filter class="solr.LowerCaseFilterFactory" />
343
				</analyzer>
344
			</fieldType>
345

    
346

    
347
			<!-- A general text field that has reasonable, generic
348
				 cross-language defaults: it tokenizes with StandardTokenizer,
349
				   removes stop words from case-insensitive "stopwords.txt"
350
				   (empty by default), and down cases.  At query time only, it
351
				   also applies synonyms.
352
			  -->
353
			<fieldType name="text_common" class="solr.TextField" positionIncrementGap="100" multiValued="true">
354
				<analyzer type="index">
355
					<tokenizer class="solr.StandardTokenizerFactory"/>
356
					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
357
					<!-- in this example, we will only use synonyms at query time
358
					<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
359
					<filter class="solr.FlattenGraphFilterFactory"/>
360
					-->
361
					<filter class="solr.LowerCaseFilterFactory"/>
362
				</analyzer>
363
				<analyzer type="query">
364
					<tokenizer class="solr.StandardTokenizerFactory"/>
365
					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
366
					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
367
					<filter class="solr.LowerCaseFilterFactory"/>
368
				</analyzer>
369
			</fieldType>
370

    
371
			<!-- A text field with defaults appropriate for English: it
372
				 tokenizes with StandardTokenizer, removes English stop words
373
				 (stopwords_en.txt), down cases, protects words from protwords.txt, and
374
				 finally applies Porter's stemming.  The query time analyzer
375
				 also applies synonyms from synonyms.txt. -->
376
			<!-- <dynamicField name="*_txt_en" type="text_en"  indexed="true"  stored="true"/> -->
377

    
378
			<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
379
				<analyzer type="index">
380
					<tokenizer class="solr.StandardTokenizerFactory"/>
381
					<!-- in this example, we will only use synonyms at query time
382
					<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
383
					<filter class="solr.FlattenGraphFilterFactory"/>
384
					-->
385
					<!-- Case insensitive stop word removal.
386
					-->
387
					<filter class="solr.StopFilterFactory"
388
					        ignoreCase="true"
389
					        words="stopwords.txt"
390
					/>
391
					<filter class="solr.LowerCaseFilterFactory"/>
392
					<filter class="solr.EnglishPossessiveFilterFactory"/>
393
					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
394
					<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
395
					<filter class="solr.EnglishMinimalStemFilterFactory"/>
396
					  -->
397
					<filter class="solr.PorterStemFilterFactory"/>
398
				</analyzer>
399
				<analyzer type="query">
400
					<tokenizer class="solr.StandardTokenizerFactory"/>
401
					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
402
					<filter class="solr.StopFilterFactory"
403
					        ignoreCase="true"
404
					        words="stopwords.txt"
405
					/>
406
					<filter class="solr.LowerCaseFilterFactory"/>
407
					<filter class="solr.EnglishPossessiveFilterFactory"/>
408
					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
409
					<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
410
					<filter class="solr.EnglishMinimalStemFilterFactory"/>
411
					  -->
412
					<filter class="solr.PorterStemFilterFactory"/>
413
				</analyzer>
414
			</fieldType>
415

    
416
			<!-- A text field with defaults appropriate for English, plus
417
				 aggressive word-splitting and autophrase features enabled.
418
				 This field is just like text_en, except it adds
419
				 WordDelimiterGraphFilter to enable splitting and matching of
420
				 words on case-change, alpha numeric boundaries, and
421
				 non-alphanumeric chars.  This means certain compound word
422
				 cases will work, for example query "wi fi" will match
423
				 document "WiFi" or "wi-fi".
424
			-->
425
			<!-- <dynamicField name="*_txt_en_split" type="text_en_splitting"  indexed="true"  stored="true"/> -->
426
			<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
427
				<analyzer type="index">
428
					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
429
					<!-- in this example, we will only use synonyms at query time
430
					<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
431
					-->
432
					<!-- Case insensitive stop word removal.
433
					-->
434
					<filter class="solr.StopFilterFactory"
435
					        ignoreCase="true"
436
					        words="stopwords.txt"
437
					/>
438
					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
439
					<filter class="solr.LowerCaseFilterFactory"/>
440
					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
441
					<filter class="solr.PorterStemFilterFactory"/>
442
					<filter class="solr.FlattenGraphFilterFactory" />
443
				</analyzer>
444
				<analyzer type="query">
445
					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
446
					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
447
					<filter class="solr.StopFilterFactory"
448
					        ignoreCase="true"
449
					        words="stopwords.txt"
450
					/>
451
					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
452
					<filter class="solr.LowerCaseFilterFactory"/>
453
					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
454
					<filter class="solr.PorterStemFilterFactory"/>
455
				</analyzer>
456
			</fieldType>
457

    
458
			<!-- Less flexible matching, but less false matches.  Probably not ideal for product names,
459
				 but may be good for SKUs.  Can insert dashes in the wrong place and still match. -->
460
			<!-- <dynamicField name="*_txt_en_split_tight" type="text_en_splitting_tight"  indexed="true"  stored="true"/> -->
461
			<fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
462
				<analyzer type="index">
463
					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
464
					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
465
					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
466
					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
467
					<filter class="solr.LowerCaseFilterFactory"/>
468
					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
469
					<filter class="solr.EnglishMinimalStemFilterFactory"/>
470
					<!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
471
						 possible with WordDelimiterGraphFilter in conjuncton with stemming. -->
472
					<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
473
					<filter class="solr.FlattenGraphFilterFactory" />
474
				</analyzer>
475
				<analyzer type="query">
476
					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
477
					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
478
					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
479
					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
480
					<filter class="solr.LowerCaseFilterFactory"/>
481
					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
482
					<filter class="solr.EnglishMinimalStemFilterFactory"/>
483
					<!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
484
						 possible with WordDelimiterGraphFilter in conjuncton with stemming. -->
485
					<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
486
				</analyzer>
487
			</fieldType>
488

    
489
			<!-- Just like text_common except it reverses the characters of
490
				   each token, to enable more efficient leading wildcard queries.
491
			-->
492
			<!-- <dynamicField name="*_txt_rev" type="text_common_rev"  indexed="true"  stored="true"/> -->
493
			<fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100">
494
				<analyzer type="index">
495
					<tokenizer class="solr.StandardTokenizerFactory"/>
496
					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
497
					<filter class="solr.LowerCaseFilterFactory"/>
498
					<filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
499
					        maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
500
				</analyzer>
501
				<analyzer type="query">
502
					<tokenizer class="solr.StandardTokenizerFactory"/>
503
					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
504
					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
505
					<filter class="solr.LowerCaseFilterFactory"/>
506
				</analyzer>
507
			</fieldType>
508

    
509
			<!-- <dynamicField name="*_phon_en" type="phonetic_en"  indexed="true"  stored="true"/> -->
510
			<fieldType name="phonetic_en" stored="false" indexed="true" class="solr.TextField" >
511
				<analyzer>
512
					<tokenizer class="solr.StandardTokenizerFactory"/>
513
					<filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
514
				</analyzer>
515
			</fieldType>
516

    
517
			<fieldType name="string_ci" class="solr.TextField" sortMissingLast="true" omitNorms="true">
518
				<analyzer type="query">
519
					<tokenizer class="solr.KeywordTokenizerFactory"/>
520
					<filter class="solr.LowerCaseFilterFactory"/>
521
				</analyzer>
522
			</fieldType>
523

    
524
			<!--
525
			  Example of using PathHierarchyTokenizerFactory at index time, so
526
			  queries for paths match documents at that path, or in descendent paths
527
			-->
528
			<!-- <dynamicField name="*_descendent_path" type="descendent_path"  indexed="true"  stored="true"/> -->
529
			<fieldType name="descendent_path" class="solr.TextField">
530
				<analyzer type="index">
531
					<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
532
				</analyzer>
533
				<analyzer type="query">
534
					<tokenizer class="solr.KeywordTokenizerFactory" />
535
				</analyzer>
536
			</fieldType>
537

    
538
			<!--
539
			  Example of using PathHierarchyTokenizerFactory at query time, so
540
			  queries for paths match documents at that path, or in ancestor paths
541
			-->
542
			<!-- <dynamicField name="*_ancestor_path" type="ancestor_path"  indexed="true"  stored="true"/> -->
543
			<fieldType name="ancestor_path" class="solr.TextField">
544
				<analyzer type="index">
545
					<tokenizer class="solr.KeywordTokenizerFactory" />
546
				</analyzer>
547
				<analyzer type="query">
548
					<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
549
				</analyzer>
550
			</fieldType>
551

    
552
			<!-- since fields of this type are by default not stored or indexed,
553
				 any data added to them will be ignored outright.  -->
554
			<fieldType name="ignored" stored="false" indexed="false" docValues="false" multiValued="true" class="solr.StrField" />
555

    
556
			<!-- This point type indexes the coordinates as separate fields (subFields)
557
			  If subFieldType is defined, it references a type, and a dynamic field
558
			  definition is created matching *___<typename>.  Alternately, if
559
			  subFieldSuffix is defined, that is used to create the subFields.
560
			  Example: if subFieldType="double", then the coordinates would be
561
				indexed in fields myloc_0___double,myloc_1___double.
562
			  Example: if subFieldSuffix="_d" then the coordinates would be indexed
563
				in fields myloc_0_d,myloc_1_d
564
			  The subFields are an implementation detail of the fieldType, and end
565
			  users normally should not need to know about them.
566
			 -->
567
			<!-- <dynamicField name="*_point" type="point"  indexed="true"  stored="true"/> -->
568
			<fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
569

    
570
			<!-- A specialized field for geospatial search filters and distance sorting. -->
571
			<fieldType name="location" class="solr.LatLonPointSpatialField" docValues="true"/>
572

    
573
			<!-- An alternative geospatial field type new to Solr 4.  It supports multiValued and polygon shapes.
574
			  For more information about this and other Spatial fields new to Solr 4, see:
575
			  http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
576
			-->
577
			<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
578
			           geo="true" distErrPct="0.025" maxDistErr="0.001" distanceUnits="kilometers" />
579

    
580
		</schema>
581
	</xsl:template>
582
</xsl:stylesheet>
(1-1/2)