Index: languages/README.txt
===================================================================
--- languages/README.txt	(revision 0)
+++ languages/README.txt	(revision 0)
@@ -0,0 +1,3 @@
+Replace schema.xml, stopwords.txt and protwords.txt in solr's conf
+by those located in your language's folder.
+
Index: languages/de/protwords.txt
===================================================================
Index: languages/de/schema.xml
===================================================================
--- languages/de/schema.xml	(revision 0)
+++ languages/de/schema.xml	(revision 0)
@@ -0,0 +1,382 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is the Solr schema file. This file should be named "schema.xml" and
+ should be in the conf directory under the solr home
+ (i.e. ./solr/conf/schema.xml by default)
+ or located where the classloader for the Solr webapp can find it.
+
+ For more information, on how to customize this file, please see
+ http://wiki.apache.org/solr/SchemaXml
+-->
+
+<schema name="drupal-0.9.3" version="1.1">
+  <!-- attribute "name" is the name of this schema and is only used for display purposes.
+       Applications should change this to reflect the nature of the search collection.
+       version="1.1" is Solr's version number for the schema syntax and semantics.  It should
+       not normally be changed by applications.
+       1.0: multiValued attribute did not exist, all fields are multiValued by nature
+       1.1: multiValued attribute introduced, false by default -->
+
+  <types>
+    <!-- field type definitions. The "name" attribute is
+       just a label to be used by field definitions.  The "class"
+       attribute and any other attributes determine the real
+       behavior of the fieldType.
+         Class names starting with "solr" refer to java classes in the
+       org.apache.solr.analysis package.
+    -->
+
+    <!-- The StrField type is not analyzed, but indexed/stored verbatim.
+       - StrField and TextField support an optional compressThreshold which
+       limits compression (if enabled in the derived fields) to values which
+       exceed a certain size (in characters).
+    -->
+    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
+
+    <!-- boolean type: "true" or "false" -->
+    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
+
+    <!-- The optional sortMissingLast and sortMissingFirst attributes are
+         currently supported on types that are sorted internally as strings.
+       - If sortMissingLast="true", then a sort on this field will cause documents
+         without the field to come after documents with the field,
+         regardless of the requested sort order (asc or desc).
+       - If sortMissingFirst="true", then a sort on this field will cause documents
+         without the field to come before documents with the field,
+         regardless of the requested sort order.
+       - If sortMissingLast="false" and sortMissingFirst="false" (the default),
+         then default lucene sorting will be used which places docs without the
+         field first in an ascending sort and last in a descending sort.
+    -->
+
+
+    <!-- numeric field types that store and index the text
+         value verbatim (and hence don't support range queries, since the
+         lexicographic ordering isn't equal to the numeric ordering) -->
+    <fieldType name="integer" class="solr.IntField" omitNorms="true"/>
+    <fieldType name="long" class="solr.LongField" omitNorms="true"/>
+    <fieldType name="float" class="solr.FloatField" omitNorms="true"/>
+    <fieldType name="double" class="solr.DoubleField" omitNorms="true"/>
+
+
+    <!-- Numeric field types that manipulate the value into
+         a string value that isn't human-readable in its internal form,
+         but with a lexicographic ordering the same as the numeric ordering,
+         so that range queries work correctly. -->
+    <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
+    <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
+    <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
+    <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
+
+
+    <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
+         is a more restricted form of the canonical representation of dateTime
+         http://www.w3.org/TR/xmlschema-2/#dateTime
+         The trailing "Z" designates UTC time and is mandatory.
+         Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
+         All other components are mandatory.
+
+         Expressions can also be used to denote calculations that should be
+         performed relative to "NOW" to determine the value, ie...
+
+               NOW/HOUR
+                  ... Round to the start of the current hour
+               NOW-1DAY
+                  ... Exactly 1 day prior to now
+               NOW/DAY+6MONTHS+3DAYS
+                  ... 6 months and 3 days in the future from the start of
+                      the current day
+
+         Consult the DateField javadocs for more information.
+      -->
+    <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
+
+    <!-- solr.TextField allows the specification of custom text analyzers
+         specified as a tokenizer and a list of token filters. Different
+         analyzers may be specified for indexing and querying.
+
+         The optional positionIncrementGap puts space between multiple fields of
+         this type on the same document, with the purpose of preventing false phrase
+         matching across fields.
+
+         For more info on customizing your analyzer chain, please see
+         http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
+     -->
+
+    <!-- One can also specify an existing Analyzer class that has a
+         default constructor via the class attribute on the analyzer element
+    <fieldType name="text_greek" class="solr.TextField">
+      <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
+    </fieldType>
+    -->
+
+    <!-- A text field that only splits on whitespace for exact matching of words -->
+    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+      </analyzer>
+    </fieldType>
+
+    <!-- A text field that uses WordDelimiterFilter to enable splitting and matching of
+        words on case-change, alpha numeric boundaries, and non-alphanumeric chars,
+        so that a query of "wifi" or "wi fi" could match a document containing "Wi-Fi".
+        Synonyms and stopwords are customized by external files, and stemming is enabled.
+        Duplicate tokens at the same position (which may result from Stemmed Synonyms or
+        WordDelim parts) are removed.
+        -->
+    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
+      <analyzer type="index">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <!-- in this example, we will only use synonyms at query time
+        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
+        -->
+        <!-- Case insensitive stop word removal.
+          add enablePositionIncrements=true in both the index and query
+          analyzers to leave a 'gap' for more accurate phrase queries.
+        -->
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                enablePositionIncrements="true"
+                />
+        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.SnowballPorterFilterFactory" language="German" protected="protwords.txt"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                enablePositionIncrements="true"
+                />
+        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.SnowballPorterFilterFactory" language="German" protected="protwords.txt"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+    </fieldType>
+
+
+    <!-- Less flexible matching, but less false matches.  Probably not ideal for product names,
+         but may be good for SKUs.  Can insert dashes in the wrong place and still match. -->
+    <fieldType name="textTight" class="solr.TextField" positionIncrementGap="100" >
+      <analyzer>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
+        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
+        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.SnowballPorterFilterFactory" language="German" protected="protwords.txt"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+    </fieldType>
+   
+   <!--  Setup simple analysis for spell checking -->
+    
+   <fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
+     <analyzer>
+       <tokenizer class="solr.StandardTokenizerFactory" />
+       <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
+       <filter class="solr.LengthFilterFactory" min="4" max="20" />
+       <filter class="solr.LowerCaseFilterFactory" /> 
+       <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
+     </analyzer>
+   </fieldType>
+  
+    <!-- This is an example of using the KeywordTokenizer along
+         With various TokenFilterFactories to produce a sortable field
+         that does not include some properties of the source text
+      -->
+    <fieldType name="sortString" class="solr.TextField" sortMissingLast="true" omitNorms="true">
+      <analyzer>
+        <!-- KeywordTokenizer does no actual tokenizing, so the entire
+             input string is preserved as a single token
+          -->
+        <tokenizer class="solr.KeywordTokenizerFactory"/>
+        <!-- The LowerCase TokenFilter does what you expect, which can be
+             when you want your sorting to be case insensitive
+          -->
+        <filter class="solr.LowerCaseFilterFactory" />
+        <!-- The TrimFilter removes any leading or trailing whitespace -->
+        <filter class="solr.TrimFilterFactory" />
+        <!-- The PatternReplaceFilter gives you the flexibility to use
+             Java Regular expression to replace any sequence of characters
+             matching a pattern with an arbitrary replacement string,
+             which may include back refrences to portions of the orriginal
+             string matched by the pattern.
+
+             See the Java Regular Expression documentation for more
+             infomation on pattern and replacement string syntax.
+
+             http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/package-summary.html
+
+        <filter class="solr.PatternReplaceFilterFactory"
+                pattern="(^\p{Punct}+)" replacement="" replace="all"
+        />
+        -->
+      </analyzer>
+    </fieldType>
+
+    <!-- since fields of this type are by default not stored or indexed, any data added to
+         them will be ignored outright
+     -->
+    <fieldtype name="ignored" stored="false" indexed="false" class="solr.StrField" />
+
+ </types>
+
+
+ <fields>
+   <!-- Valid attributes for fields:
+     name: mandatory - the name for the field
+     type: mandatory - the name of a previously defined type from the <types> section
+     indexed: true if this field should be indexed (searchable or sortable)
+     stored: true if this field should be retrievable
+     compressed: [false] if this field should be stored using gzip compression
+       (this will only apply if the field type is compressable; among
+       the standard field types, only TextField and StrField are)
+     multiValued: true if this field may contain multiple values per document
+     omitNorms: (expert) set to true to omit the norms associated with
+       this field (this disables length normalization and index-time
+       boosting for the field, and saves some memory).  Only full-text
+       fields or fields that need an index-time boost need norms.
+   -->
+
+<!-- The document id is derived from a site-spcific key (hash) and the node ID like:
+     $document->id = $hash . '/node/' . $node->nid; -->
+
+   <field name="id" type="string" indexed="true" stored="true" required="true" />
+
+<!-- These are the fields that correspond to a Drupal node. The beauty of having
+     Lucene store title, body, type, etc., is that we retrieve them with the search
+     result set and don't need to go to the database with a node_load. -->
+
+   <field name="site" type="string" indexed="true" stored="true"/>
+   <field name="hash" type="string" indexed="true" stored="true"/>
+   <field name="url" type="string" indexed="true" stored="true"/>
+   <field name="title" type="text" indexed="true" stored="true" termVectors="true" omitNorms="true"/>
+   <field name="sort_title" type="sortString" indexed="true" stored="false"/>
+   <field name="body" type="text" indexed="true" stored="false" termVectors="true"/>
+   <field name="teaser" type="text" indexed="false" stored="true"/>
+   <field name="type" type="string" indexed="true" stored="true"/>
+   <field name="type_name" type="string" indexed="true" stored="true"/>
+   <field name="path" type="string" indexed="true" stored="true"/>
+   <field name="path_alias" type="text" indexed="true" stored="true" termVectors="true"/>
+   <field name="uid"  type="integer" indexed="true" stored="true"/>
+   <field name="name" type="text" indexed="true" stored="true" termVectors="true"/>
+   <field name="sname" type="string" indexed="true" stored="false"/>
+   <field name="sort_name" type="sortString" indexed="true" stored="false"/>
+   <field name="created" type="date" indexed="true" stored="true"/>
+   <field name="changed" type="date" indexed="true" stored="true"/>
+   <field name="last_comment_or_change" type="date" indexed="true" stored="true"/>
+   <field name="nid"  type="integer" indexed="true" stored="true"/>
+   <field name="status" type="boolean" indexed="true" stored="true"/>
+   <field name="promote" type="boolean" indexed="true" stored="true"/>
+   <field name="moderate" type="boolean" indexed="true" stored="true"/>
+   <field name="sticky" type="boolean" indexed="true" stored="true"/>
+   <field name="tnid"  type="integer" indexed="true" stored="true"/>
+   <field name="translate" type="boolean" indexed="true" stored="true"/>
+   <field name="language" type="string" indexed="true" stored="true"/>
+   <field name="comment_count" type="integer" indexed="true" stored="true"/>
+   <field name="tid"  type="integer" indexed="true" stored="true" multiValued="true"/>
+   <field name="vid"  type="integer" indexed="true" stored="true" multiValued="true"/>
+   <field name="taxonomy_names" type="text" indexed="true" stored="false" termVectors="true" multiValued="true" omitNorms="true"/>
+   <!-- The string version of the title is used for sorting -->
+   <copyField source="title" dest="sort_title"/>
+   <!-- The string versions of the name used for sorting/multi-site facets -->
+   <copyField source="name" dest="sname"/>
+   <copyField source="name" dest="sort_name"/>
+   <!-- Copy terms to a single field that contains all taxonomy term names -->
+   <copyField source="ts_vid_*" dest="taxonomy_names"/>
+   <!-- The teaser can be used when a better snippet is not available -->
+   <copyField source="body_result" dest="teaser" maxChars="300"/>
+  
+   <!-- A set of fields to contain text extracted from tag contents which we
+        can boost at query time. -->
+   <field name="tags_h1" type="text" indexed="true" stored="false" omitNorms="true"/>
+   <field name="tags_h2_h3" type="text" indexed="true" stored="false" omitNorms="true"/>
+   <field name="tags_h4_h5_h6" type="text" indexed="true" stored="false" omitNorms="true"/>
+   <field name="tags_a" type="text" indexed="true" stored="false" omitNorms="true"/>
+   <!-- Inline tags are typically u, b, i, em, strong -->
+   <field name="tags_inline" type="text" indexed="true" stored="false" omitNorms="true"/>
+
+   <!-- Here, default is used to create a "timestamp" field indicating
+        when each document was indexed.-->
+   <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
+
+	<!-- This field is used to build the spellchecker index -->
+   <field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>
+  
+  <!-- copyField commands copy one field to another at the time a document
+        is added to the index.  It's used either to index the same field differently,
+        or to add multiple fields to the same field for easier/faster searching.  -->
+   <copyField source="title" dest="spell"/>
+   <copyField source="body" dest="spell"/>
+
+   <!-- Dynamic field definitions.  If a field name is not found, dynamicFields
+        will be used if the name matches any of the patterns.
+        RESTRICTION: the glob-like pattern in the name attribute must have
+        a "*" only at the start or the end.
+        EXAMPLE:  name="*_i" will match any field ending in _i (like myid_i, z_i)
+        Longer patterns will be matched first.  if equal size patterns
+        both match, the first appearing in the schema will be used.  -->
+
+   <dynamicField name="is_*"  type="integer" indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="im_*"  type="integer" indexed="true"  stored="true" multiValued="true"/>
+   <dynamicField name="sis_*" type="sint"    indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="sim_*" type="sint"    indexed="true"  stored="true" multiValued="true"/>
+   <dynamicField name="sm_*"  type="string"    indexed="true"  stored="true" multiValued="true"/>
+   <dynamicField name="tm_*"  type="text"    indexed="true"  stored="true" multiValued="true" termVectors="true"/>
+   <dynamicField name="ss_*"  type="string"    indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="ts_*"  type="text"    indexed="true"  stored="true" multiValued="false" termVectors="true"/>
+   <dynamicField name="ds_*" type="date"    indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="dm_*" type="date"    indexed="true"  stored="true" multiValued="true"/>
+   <dynamicField name="bm_*"  type="boolean" indexed="true"  stored="true" multiValued="true"/>
+   <dynamicField name="bs_*"  type="boolean" indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="fs_*"  type="sfloat"  indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="fm_*"  type="sfloat"  indexed="true"  stored="true" multiValued="true"/>
+   <dynamicField name="ps_*"  type="sdouble" indexed="true"  stored="true" multiValued="false"/>
+   <dynamicField name="pm_*"  type="sdouble" indexed="true"  stored="true" multiValued="true"/>
+   <!-- Sortable version of the dynamic string field -->
+   <dynamicField name="sort_ss_*" type="sortString" indexed="true" stored="false"/>
+   <copyField source="ss_*" dest="sort_ss_*"/>
+   <!-- This field is used to store node access records, as opposed to CCK field data -->
+   <dynamicField name="nodeaccess*" type="integer" indexed="true" stored="false" multiValued="true"/>
+
+   <!-- The following causes solr to ignore any fields that don't already match an existing
+        field name or dynamic field, rather than reporting them as an error.
+        Alternately, change the type="ignored" to some other type e.g. "text" if you want
+        unknown fields indexed and/or stored by default -->
+   <dynamicField name="*" type="ignored" multiValued="true" />
+   
+   
+   
+   <!-- BACKWARDS COMPATIBILITY -->
+   <!-- Here is where we store fields which are no longer used -->
+   
+   <!-- Fields previously used for sorting  -->
+   <field name="stitle" type="string" indexed="true" stored="true"/>
+   <field name="title_sort" type="sortString" indexed="true" stored="false"/>
+
+   <field name="name_sort" type="sortString" indexed="true" stored="false"/>
+    
+    
+   <!-- /BACKWARDS COMPATIBILITY -->
+ </fields>
+
+ <!-- Field to use to determine and enforce document uniqueness.
+      Unless this field is marked with required="false", it will be a required field
+   -->
+ <uniqueKey>id</uniqueKey>
+
+ <!-- field for the QueryParser to use when an explicit fieldname is absent -->
+ <defaultSearchField>body</defaultSearchField>
+
+ <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
+ <solrQueryParser defaultOperator="AND"/>
+
+</schema>
Index: languages/de/stopwords.txt
===================================================================
--- languages/de/stopwords.txt	(revision 0)
+++ languages/de/stopwords.txt	(revision 0)
@@ -0,0 +1,103 @@
+# GERMAN STOPWORDS
+# to be discussed / to be continued
+
+bsp.
+bzw
+
+ca.
+ca
+
+da
+dabei
+dadurch
+dafür
+daher
+dahin
+damit
+danach
+daneben
+dank
+dann
+dannen
+daran
+daraus
+darin
+darüber
+darüberhinaus
+darum
+darunter
+das
+dass
+daß
+dasselbe
+davon
+davor
+dazu
+dein
+deine
+deinem
+deinen
+deiner
+deines
+dem
+demnach
+demselben
+den
+denen
+denn
+dennoch
+denselben
+der
+derart
+derartig
+derem
+deren
+derer
+derjenige
+derjenigen
+derselbe
+derselben
+derzeit
+des
+deshalb
+desselben
+dessen
+desto
+deswegen
+dich
+die
+diejenige
+dies
+diese
+dieselbe
+dieselben
+diesem
+diesen
+dieser
+dieses
+diesseits
+dir
+direkt
+direkte
+direkten
+direkter
+doch
+dort
+dorther
+dorthin
+drauf
+drin
+dritte
+drüber
+drunter
+du
+dunklen
+durch
+durchaus
+
+ein
+eine
+einem
+einen
+einer
+eines
