Index: lucene/analysis/common/src/test/org/apache/lucene/analysis/fr/TestFrenchLightStemFilter.java
===================================================================
--- lucene/analysis/common/src/test/org/apache/lucene/analysis/fr/TestFrenchLightStemFilter.java	(revision 1339303)
+++ lucene/analysis/common/src/test/org/apache/lucene/analysis/fr/TestFrenchLightStemFilter.java	(working copy)
@@ -153,6 +153,20 @@
     
     checkOneTerm(analyzer, "disposition", "dispos");
     checkOneTerm(analyzer, "dispose", "dispos");
+
+    // SOLR-3463 : abusive compression of repeated characters in numbers
+    // Trailing repeated char elision :
+    checkOneTerm(analyzer, "1234555", "1234555");
+    // Repeated char within numbers with more than 4 characters :
+    checkOneTerm(analyzer, "12333345", "12333345");
+    // Short numbers weren't affected already:
+    checkOneTerm(analyzer, "1234", "1234");
+    // Ensure behaviour is preserved for words!
+    // Trailing repeated char elision :
+    checkOneTerm(analyzer, "abcdeff", "abcdef");
+    // Repeated char within words with more than 4 characters :
+    checkOneTerm(analyzer, "abcccddeef", "abcdef");
+
   }
   
   /** Test against a vocabulary from the reference impl */
Index: lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java
===================================================================
--- lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java	(revision 1339303)
+++ lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java	(working copy)
@@ -246,7 +246,7 @@
       
       char ch = s[0];
       for (int i = 1; i < len; i++) {
-        if (s[i] == ch)
+        if (s[i] == ch && Character.isLetter(ch))
           len = delete(s, i--, len);
         else
           ch = s[i];
@@ -260,7 +260,7 @@
         if (s[len-1] == 'r') len--;
         if (s[len-1] == 'e') len--;
         if (s[len-1] == 'e') len--;
-        if (s[len-1] == s[len-2]) len--;
+        if (s[len-1] == s[len-2] && Character.isLetter(s[len-1])) len--;
     }
     return len;
   }
