You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by to...@apache.org on 2019/06/22 01:47:37 UTC

[lucene-solr] branch master updated: LUCENE-8778: Define analyzer SPI names as static final fields and document the names in all analysis components. This also changes SPI loader to detect service names via the static NAME fields instead of class names.

This is an automated email from the ASF dual-hosted git repository.

tomoko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/master by this push:
     new 98c85a0  LUCENE-8778: Define analyzer SPI names as static final fields and document the names in all analysis components. This also changes SPI loader to detect service names via the static NAME fields instead of class names.
98c85a0 is described below

commit 98c85a0e1a611d3a0337483ab87183bfeccec33b
Author: Tomoko Uchida <to...@apache.org>
AuthorDate: Sat Jun 22 10:46:37 2019 +0900

    LUCENE-8778: Define analyzer SPI names as static final fields and document the names in all analysis components. This also changes SPI loader to detect service names via the static NAME fields instead of class names.
---
 .gitignore                                         |  1 +
 lucene/CHANGES.txt                                 |  2 +
 .../ar/ArabicNormalizationFilterFactory.java       |  4 ++
 .../analysis/ar/ArabicStemFilterFactory.java       |  4 ++
 .../analysis/bg/BulgarianStemFilterFactory.java    |  6 +-
 .../bn/BengaliNormalizationFilterFactory.java      |  4 ++
 .../analysis/bn/BengaliStemFilterFactory.java      |  4 ++
 .../analysis/br/BrazilianStemFilterFactory.java    |  4 ++
 .../charfilter/HTMLStripCharFilterFactory.java     |  5 ++
 .../charfilter/MappingCharFilterFactory.java       |  4 ++
 .../analysis/cjk/CJKBigramFilterFactory.java       |  5 ++
 .../lucene/analysis/cjk/CJKWidthFilterFactory.java |  4 ++
 .../ckb/SoraniNormalizationFilterFactory.java      |  4 ++
 .../analysis/ckb/SoraniStemFilterFactory.java      |  4 ++
 .../commongrams/CommonGramsFilterFactory.java      |  7 +-
 .../commongrams/CommonGramsQueryFilterFactory.java |  3 +
 .../DictionaryCompoundWordTokenFilterFactory.java  |  5 ++
 .../HyphenationCompoundWordTokenFilterFactory.java |  5 ++
 .../analysis/core/DecimalDigitFilterFactory.java   |  4 ++
 .../analysis/core/FlattenGraphFilterFactory.java   |  4 ++
 .../analysis/core/KeywordTokenizerFactory.java     |  5 ++
 .../analysis/core/LetterTokenizerFactory.java      |  5 ++
 .../analysis/core/LowerCaseFilterFactory.java      |  4 ++
 .../lucene/analysis/core/StopFilterFactory.java    |  5 ++
 .../analysis/core/TypeTokenFilterFactory.java      |  5 ++
 .../analysis/core/UpperCaseFilterFactory.java      |  4 ++
 .../analysis/core/WhitespaceTokenizerFactory.java  |  5 ++
 .../lucene/analysis/cz/CzechStemFilterFactory.java |  4 ++
 .../analysis/de/GermanLightStemFilterFactory.java  |  4 ++
 .../de/GermanMinimalStemFilterFactory.java         |  4 ++
 .../de/GermanNormalizationFilterFactory.java       |  4 ++
 .../analysis/de/GermanStemFilterFactory.java       |  4 ++
 .../analysis/el/GreekLowerCaseFilterFactory.java   |  4 ++
 .../lucene/analysis/el/GreekStemFilterFactory.java |  4 ++
 .../en/EnglishMinimalStemFilterFactory.java        |  4 ++
 .../en/EnglishPossessiveFilterFactory.java         |  4 ++
 .../lucene/analysis/en/KStemFilterFactory.java     |  4 ++
 .../analysis/en/PorterStemFilterFactory.java       |  4 ++
 .../analysis/es/SpanishLightStemFilterFactory.java |  4 ++
 .../analysis/fa/PersianCharFilterFactory.java      |  4 ++
 .../fa/PersianNormalizationFilterFactory.java      |  4 ++
 .../analysis/fi/FinnishLightStemFilterFactory.java |  4 ++
 .../analysis/fr/FrenchLightStemFilterFactory.java  |  4 ++
 .../fr/FrenchMinimalStemFilterFactory.java         |  4 ++
 .../analysis/ga/IrishLowerCaseFilterFactory.java   |  4 ++
 .../gl/GalicianMinimalStemFilterFactory.java       |  4 ++
 .../analysis/gl/GalicianStemFilterFactory.java     |  4 ++
 .../hi/HindiNormalizationFilterFactory.java        |  4 ++
 .../lucene/analysis/hi/HindiStemFilterFactory.java |  4 ++
 .../hu/HungarianLightStemFilterFactory.java        |  4 ++
 .../hunspell/HunspellStemFilterFactory.java        |  5 ++
 .../analysis/id/IndonesianStemFilterFactory.java   |  5 ++
 .../in/IndicNormalizationFilterFactory.java        |  4 ++
 .../analysis/it/ItalianLightStemFilterFactory.java |  4 ++
 .../analysis/lv/LatvianStemFilterFactory.java      |  4 ++
 .../analysis/minhash/MinHashFilterFactory.java     |  5 ++
 .../miscellaneous/ASCIIFoldingFilterFactory.java   |  5 ++
 .../miscellaneous/CapitalizationFilterFactory.java |  5 ++
 .../miscellaneous/CodepointCountFilterFactory.java |  5 ++
 .../ConcatenateGraphFilterFactory.java             |  4 ++
 .../ConditionalTokenFilterFactory.java             |  4 ++
 .../miscellaneous/DateRecognizerFilterFactory.java |  4 ++
 .../DelimitedTermFrequencyTokenFilterFactory.java  |  5 ++
 .../miscellaneous/FingerprintFilterFactory.java    |  4 ++
 .../FixBrokenOffsetsFilterFactory.java             |  4 ++
 .../HyphenatedWordsFilterFactory.java              |  4 ++
 .../miscellaneous/KeepWordFilterFactory.java       |  5 ++
 .../miscellaneous/KeywordMarkerFilterFactory.java  |  5 ++
 .../miscellaneous/KeywordRepeatFilterFactory.java  |  4 ++
 .../miscellaneous/LengthFilterFactory.java         |  5 ++
 .../LimitTokenCountFilterFactory.java              |  4 ++
 .../LimitTokenOffsetFilterFactory.java             |  4 ++
 .../LimitTokenPositionFilterFactory.java           |  4 ++
 .../miscellaneous/ProtectedTermFilterFactory.java  |  3 +
 .../RemoveDuplicatesTokenFilterFactory.java        |  4 ++
 .../ScandinavianFoldingFilterFactory.java          |  4 ++
 .../ScandinavianNormalizationFilterFactory.java    |  4 ++
 .../StemmerOverrideFilterFactory.java              |  5 ++
 .../analysis/miscellaneous/TrimFilterFactory.java  |  4 ++
 .../miscellaneous/TruncateTokenFilterFactory.java  |  4 ++
 .../miscellaneous/TypeAsSynonymFilterFactory.java  |  5 ++
 .../miscellaneous/WordDelimiterFilterFactory.java  |  5 ++
 .../WordDelimiterGraphFilterFactory.java           |  5 ++
 .../analysis/ngram/EdgeNGramFilterFactory.java     |  5 ++
 .../analysis/ngram/EdgeNGramTokenizerFactory.java  |  5 ++
 .../lucene/analysis/ngram/NGramFilterFactory.java  |  5 ++
 .../analysis/ngram/NGramTokenizerFactory.java      |  5 ++
 .../no/NorwegianLightStemFilterFactory.java        |  4 ++
 .../no/NorwegianMinimalStemFilterFactory.java      |  4 ++
 .../path/PathHierarchyTokenizerFactory.java        |  5 ++
 .../pattern/PatternCaptureGroupFilterFactory.java  |  5 ++
 .../pattern/PatternReplaceCharFilterFactory.java   |  5 ++
 .../pattern/PatternReplaceFilterFactory.java       |  5 ++
 .../analysis/pattern/PatternTokenizerFactory.java  |  5 ++
 .../SimplePatternSplitTokenizerFactory.java        |  5 ++
 .../pattern/SimplePatternTokenizerFactory.java     |  5 ++
 .../DelimitedPayloadTokenFilterFactory.java        |  5 ++
 .../payloads/NumericPayloadTokenFilterFactory.java |  5 ++
 .../TokenOffsetPayloadTokenFilterFactory.java      |  4 ++
 .../payloads/TypeAsPayloadTokenFilterFactory.java  |  4 ++
 .../pt/PortugueseLightStemFilterFactory.java       |  4 ++
 .../pt/PortugueseMinimalStemFilterFactory.java     |  4 ++
 .../analysis/pt/PortugueseStemFilterFactory.java   |  4 ++
 .../reverse/ReverseStringFilterFactory.java        |  4 ++
 .../analysis/ru/RussianLightStemFilterFactory.java |  4 ++
 .../shingle/FixedShingleFilterFactory.java         |  4 ++
 .../analysis/shingle/ShingleFilterFactory.java     |  5 ++
 .../snowball/SnowballPorterFilterFactory.java      |  5 ++
 .../sr/SerbianNormalizationFilterFactory.java      |  5 ++
 .../analysis/standard/ClassicFilterFactory.java    |  4 ++
 .../analysis/standard/ClassicTokenizerFactory.java |  5 ++
 .../standard/StandardTokenizerFactory.java         |  5 ++
 .../standard/UAX29URLEmailTokenizerFactory.java    |  5 ++
 .../analysis/sv/SwedishLightStemFilterFactory.java |  4 ++
 .../analysis/synonym/SynonymFilterFactory.java     |  5 ++
 .../synonym/SynonymGraphFilterFactory.java         |  5 ++
 .../lucene/analysis/th/ThaiTokenizerFactory.java   |  4 ++
 .../analysis/tr/ApostropheFilterFactory.java       |  4 ++
 .../analysis/tr/TurkishLowerCaseFilterFactory.java |  4 ++
 .../lucene/analysis/util/AnalysisSPILoader.java    | 76 ++++++++++++++--------
 .../lucene/analysis/util/ElisionFilterFactory.java |  5 ++
 .../lucene/analysis/util/TokenFilterFactory.java   |  5 +-
 .../wikipedia/WikipediaTokenizerFactory.java       |  5 ++
 .../analysis/util/TestAnalysisSPILoader.java       |  6 +-
 .../analysis/icu/ICUFoldingFilterFactory.java      |  5 ++
 .../icu/ICUNormalizer2CharFilterFactory.java       |  5 ++
 .../analysis/icu/ICUNormalizer2FilterFactory.java  |  5 ++
 .../analysis/icu/ICUTransformFilterFactory.java    |  5 ++
 .../icu/segmentation/ICUTokenizerFactory.java      |  5 ++
 .../analysis/ja/JapaneseBaseFormFilterFactory.java |  4 ++
 .../ja/JapaneseIterationMarkCharFilterFactory.java |  4 ++
 .../ja/JapaneseKatakanaStemFilterFactory.java      |  5 ++
 .../analysis/ja/JapaneseNumberFilterFactory.java   |  4 ++
 .../ja/JapanesePartOfSpeechStopFilterFactory.java  |  4 ++
 .../ja/JapaneseReadingFormFilterFactory.java       |  5 ++
 .../analysis/ja/JapaneseTokenizerFactory.java      |  5 ++
 .../morfologik/MorfologikFilterFactory.java        |  5 ++
 .../ko/KoreanPartOfSpeechStopFilterFactory.java    |  5 ++
 .../ko/KoreanReadingFormFilterFactory.java         |  4 ++
 .../lucene/analysis/ko/KoreanTokenizerFactory.java |  5 ++
 .../opennlp/OpenNLPChunkerFilterFactory.java       |  5 ++
 .../opennlp/OpenNLPLemmatizerFilterFactory.java    |  5 ++
 .../analysis/opennlp/OpenNLPPOSFilterFactory.java  |  5 ++
 .../analysis/opennlp/OpenNLPTokenizerFactory.java  |  5 ++
 .../phonetic/BeiderMorseFilterFactory.java         |  5 ++
 .../DaitchMokotoffSoundexFilterFactory.java        |  5 ++
 .../phonetic/DoubleMetaphoneFilterFactory.java     |  5 ++
 .../analysis/phonetic/PhoneticFilterFactory.java   |  5 ++
 .../cn/smart/HMMChineseTokenizerFactory.java       |  4 ++
 .../stempel/StempelPolishStemFilterFactory.java    |  6 +-
 lucene/common-build.xml                            |  2 +
 .../analyzing/SuggestStopFilterFactory.java        |  7 +-
 .../tools/src/groovy/check-source-patterns.groovy  | 11 ++++
 .../solr/analysis/LowerCaseTokenizerFactory.java   |  4 ++
 .../analysis/ReversedWildcardFilterFactory.java    |  4 ++
 .../schema/analysis/ManagedStopFilterFactory.java  |  4 ++
 .../analysis/ManagedSynonymFilterFactory.java      |  4 ++
 .../analysis/ManagedSynonymGraphFilterFactory.java |  4 ++
 .../tagger/WordLengthTaggingFilterFactory.java     |  6 ++
 159 files changed, 750 insertions(+), 36 deletions(-)

diff --git a/.gitignore b/.gitignore
index 11d7f83..1a3e1db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,4 @@ pom.xml
 .pydevproject
 __pycache__
 /dev-tools/scripts/scripts.iml
+
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 1892609..09ef1fa 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -30,6 +30,8 @@ Bug fixes
 Other
 
 * LUCENE-8768: Fix Javadocs build in Java 11. (Namgyu Kim)
+* LUCENE-8778: Define analyzer SPI names as static final fields and document the names in Javadocs.
+  (Tomoko Uchida, Uwe Schindler)
 
 ======================= Lucene 8.2.0 =======================
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicNormalizationFilterFactory.java
index 3bf2227..a1b5c2d 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicNormalizationFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ArabicNormalizationFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "arabicNormalization";
+
   /** Creates a new ArabicNormalizationFilterFactory */
   public ArabicNormalizationFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicStemFilterFactory.java
index 93864e7..5a12a71 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ar/ArabicStemFilterFactory.java
@@ -34,9 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ArabicStemFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "arabicStem";
+
   /** Creates a new ArabicStemFilterFactory */
   public ArabicStemFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/bg/BulgarianStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/bg/BulgarianStemFilterFactory.java
index 380adbd..980708b 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/bg/BulgarianStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/bg/BulgarianStemFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class BulgarianStemFilterFactory extends TokenFilterFactory {
-  
+
+  /** SPI name */
+  public static final String NAME = "bulgarianStem";
+
   /** Creates a new BulgarianStemFilterFactory */
   public BulgarianStemFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliNormalizationFilterFactory.java
index d537f22..975805b 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliNormalizationFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class BengaliNormalizationFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "bengaliNormalization";
+
   public BengaliNormalizationFilterFactory(Map<String,String> args) {
     super(args);
     if (!args.isEmpty()) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliStemFilterFactory.java
index 7383dbb..999e1c1 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/bn/BengaliStemFilterFactory.java
@@ -32,9 +32,13 @@ import java.util.Map;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class BengaliStemFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "bengaliStem";
+
   public BengaliStemFilterFactory(Map<String,String> args) {
     super(args);
     if (!args.isEmpty()) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/br/BrazilianStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/br/BrazilianStemFilterFactory.java
index 065bdcc..bcf00d6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/br/BrazilianStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/br/BrazilianStemFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class BrazilianStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "brazilianStem";
   
   /** Creates a new BrazilianStemFilterFactory */
   public BrazilianStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLStripCharFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLStripCharFilterFactory.java
index 8ad1488..372e349 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLStripCharFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/HTMLStripCharFilterFactory.java
@@ -35,8 +35,13 @@ import java.util.regex.Pattern;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class HTMLStripCharFilterFactory extends CharFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "htmlStrip";
+
   final Set<String> escapedTags;
   static final Pattern TAG_NAME_PATTERN = Pattern.compile("[^\\s,]+");
   
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/MappingCharFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/MappingCharFilterFactory.java
index de0e22b..dbf9358 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/MappingCharFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/charfilter/MappingCharFilterFactory.java
@@ -40,10 +40,14 @@ import org.apache.lucene.analysis.util.ResourceLoaderAware;
  * &lt;/fieldType&gt;</pre>
  *
  * @since Solr 1.4
+ * @lucene.spi {@value #NAME}
  */
 public class MappingCharFilterFactory extends CharFilterFactory implements
     ResourceLoaderAware {
 
+  /** SPI name */
+  public static final String NAME = "mapping";
+
   protected NormalizeCharMap normMap;
   private final String mapping;
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKBigramFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKBigramFilterFactory.java
index e0c6097..c5100d6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKBigramFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKBigramFilterFactory.java
@@ -36,8 +36,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class CJKBigramFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "cjkBigram";
+
   final int flags;
   final boolean outputUnigrams;
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKWidthFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKWidthFilterFactory.java
index 6754bf5..6c9aa83 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKWidthFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/cjk/CJKWidthFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class CJKWidthFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "cjkWidth";
   
   /** Creates a new CJKWidthFilterFactory */
   public CJKWidthFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniNormalizationFilterFactory.java
index b552ae9..9237cc1 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniNormalizationFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.7.0
+ * @lucene.spi {@value #NAME}
  */
 public class SoraniNormalizationFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "soraniNormalization";
+
   /** Creates a new SoraniNormalizationFilterFactory */
   public SoraniNormalizationFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniStemFilterFactory.java
index 50aa971..1b18c44 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ckb/SoraniStemFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.7.0
+ * @lucene.spi {@value #NAME}
  */
 public class SoraniStemFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "soraniStem";
+
   /** Creates a new SoraniStemFilterFactory */
   public SoraniStemFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsFilterFactory.java
index 77ba8a8..523601b 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsFilterFactory.java
@@ -39,9 +39,14 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class CommonGramsFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
-  // TODO: shared base class for Stop/Keep/CommonGrams? 
+
+  /** SPI name */
+  public static final String NAME = "commonGrams";
+
+  // TODO: shared base class for Stop/Keep/CommonGrams?
   private CharArraySet commonWords;
   private final String commonWordFiles;
   private final String format;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsQueryFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsQueryFilterFactory.java
index 2d65c57..0431b58 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsQueryFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/commongrams/CommonGramsQueryFilterFactory.java
@@ -34,9 +34,12 @@ import org.apache.lucene.analysis.TokenStream;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class CommonGramsQueryFilterFactory extends CommonGramsFilterFactory {
 
+  public static final String NAME = "commonGramsQuery";
+
   /** Creates a new CommonGramsQueryFilterFactory */
   public CommonGramsQueryFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/DictionaryCompoundWordTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/DictionaryCompoundWordTokenFilterFactory.java
index db475e3..ee80e1e 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/DictionaryCompoundWordTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/DictionaryCompoundWordTokenFilterFactory.java
@@ -38,8 +38,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class DictionaryCompoundWordTokenFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "dictionaryCompoundWord";
+
   private CharArraySet dictionary;
   private final String dictFile;
   private final int minWordSize;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/HyphenationCompoundWordTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/HyphenationCompoundWordTokenFilterFactory.java
index 6b018d6..b7f3037 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/HyphenationCompoundWordTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/compound/HyphenationCompoundWordTokenFilterFactory.java
@@ -58,8 +58,13 @@ import org.xml.sax.InputSource;
  *
  * @see HyphenationCompoundWordTokenFilter
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class HyphenationCompoundWordTokenFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "hyphenationCompoundWord";
+
   private CharArraySet dictionary;
   private HyphenationTree hyphenator;
   private final String dictFile;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/DecimalDigitFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/DecimalDigitFilterFactory.java
index 2db789a..1ebca98 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/DecimalDigitFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/DecimalDigitFilterFactory.java
@@ -32,8 +32,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 5.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class DecimalDigitFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "decimalDigit";
   
   /** Creates a new DecimalDigitFilterFactory */
   public DecimalDigitFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/FlattenGraphFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/FlattenGraphFilterFactory.java
index 1021c74..c3afe4f 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/FlattenGraphFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/FlattenGraphFilterFactory.java
@@ -27,9 +27,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *
  * @lucene.experimental
  * @since 6.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class FlattenGraphFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "flattenGraph";
+
   /** Creates a new FlattenGraphFilterFactory */
   public FlattenGraphFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/KeywordTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/KeywordTokenizerFactory.java
index f2d84f4..1256472 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/KeywordTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/KeywordTokenizerFactory.java
@@ -40,8 +40,13 @@ import static org.apache.lucene.analysis.standard.StandardTokenizer.MAX_TOKEN_LE
  * </ul>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class KeywordTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "keyword";
+
   private final int maxTokenLen;
   
   /** Creates a new KeywordTokenizerFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LetterTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LetterTokenizerFactory.java
index ab5cefd..6cb9242 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LetterTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LetterTokenizerFactory.java
@@ -42,8 +42,13 @@ import static org.apache.lucene.analysis.standard.StandardTokenizer.MAX_TOKEN_LE
  * </ul>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class LetterTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "letter";
+
   private final int maxTokenLen;
 
   /** Creates a new LetterTokenizerFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LowerCaseFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LowerCaseFilterFactory.java
index d0e0791..f47b860 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LowerCaseFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/LowerCaseFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class LowerCaseFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "lowercase";
   
   /** Creates a new LowerCaseFilterFactory */
   public LowerCaseFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/StopFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/StopFilterFactory.java
index 3806b83..a2b5b80 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/StopFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/StopFilterFactory.java
@@ -71,8 +71,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * </ul>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class StopFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "stop";
+
   public static final String FORMAT_WORDSET = "wordset";
   public static final String FORMAT_SNOWBALL = "snowball";
   
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/TypeTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/TypeTokenFilterFactory.java
index ffa0853..920f24f 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/TypeTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/TypeTokenFilterFactory.java
@@ -39,8 +39,13 @@ import java.util.Set;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class TypeTokenFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "type";
+
   private final boolean useWhitelist;
   private final String stopTypesFiles;
   private Set<String> stopTypes;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/UpperCaseFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/UpperCaseFilterFactory.java
index 24515d2..5d1e1b7 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/UpperCaseFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/UpperCaseFilterFactory.java
@@ -37,8 +37,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * when you require uppercase tokens.  Use the {@link LowerCaseFilterFactory} for 
  * general search matching
  * @since 4.7.0
+ * @lucene.spi {@value #NAME}
  */
 public class UpperCaseFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "uppercase";
   
   /** Creates a new UpperCaseFilterFactory */
   public UpperCaseFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/WhitespaceTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/WhitespaceTokenizerFactory.java
index b04e9ac..c2aac5d 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/WhitespaceTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/core/WhitespaceTokenizerFactory.java
@@ -47,8 +47,13 @@ import static org.apache.lucene.analysis.standard.StandardTokenizer.MAX_TOKEN_LE
  * </ul>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class WhitespaceTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "whitespace";
+
   public static final String RULE_JAVA = "java";
   public static final String RULE_UNICODE = "unicode";
   private static final Collection<String> RULE_NAMES = Arrays.asList(RULE_JAVA, RULE_UNICODE);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/cz/CzechStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/cz/CzechStemFilterFactory.java
index 2e4ff76..75c8851 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/cz/CzechStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/cz/CzechStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class CzechStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "czechStem";
   
   /** Creates a new CzechStemFilterFactory */
   public CzechStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemFilterFactory.java
index b85faa4..63b4468 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class GermanLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "germanLightStem";
   
   /** Creates a new GermanLightStemFilterFactory */
   public GermanLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemFilterFactory.java
index f0ccfa9..0e0eb78 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class GermanMinimalStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "germanMinimalStem";
   
   /** Creates a new GermanMinimalStemFilterFactory */
   public GermanMinimalStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanNormalizationFilterFactory.java
index bed3203..b99c305 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanNormalizationFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre> 
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class GermanNormalizationFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "germanNormalization";
+
   /** Creates a new GermanNormalizationFilterFactory */
   public GermanNormalizationFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanStemFilterFactory.java
index 545fcff..567b126 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/de/GermanStemFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class GermanStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "germanStem";
   
   /** Creates a new GermanStemFilterFactory */
   public GermanStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekLowerCaseFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekLowerCaseFilterFactory.java
index 17e7adf..4149c41 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekLowerCaseFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekLowerCaseFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class GreekLowerCaseFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "greekLowerCase";
  
   /** Creates a new GreekLowerCaseFilterFactory */
   public GreekLowerCaseFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekStemFilterFactory.java
index 4ced779..66e415f 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/el/GreekStemFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class GreekStemFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "greekStem";
+
   /** Creates a new GreekStemFilterFactory */
   public GreekStemFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishMinimalStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishMinimalStemFilterFactory.java
index 062579b..99953ea 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishMinimalStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishMinimalStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class EnglishMinimalStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "englishMinimalStem";
   
   /** Creates a new EnglishMinimalStemFilterFactory */
   public EnglishMinimalStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishPossessiveFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishPossessiveFilterFactory.java
index ef09093..dbefeec 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishPossessiveFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/EnglishPossessiveFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class EnglishPossessiveFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "englishPossessive";
   
   /** Creates a new EnglishPossessiveFilterFactory */
   public EnglishPossessiveFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/KStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/KStemFilterFactory.java
index b72c805..0bf1a71 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/KStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/KStemFilterFactory.java
@@ -34,9 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class KStemFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "kStem";
+
   /** Creates a new KStemFilterFactory */
   public KStemFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/PorterStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/PorterStemFilterFactory.java
index b62865c..10fba1f 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/PorterStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/en/PorterStemFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PorterStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "porterStem";
   
   /** Creates a new PorterStemFilterFactory */
   public PorterStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemFilterFactory.java
index 7ad81fa..a9cc487 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class SpanishLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "spanishLightStem";
   
   /** Creates a new SpanishLightStemFilterFactory */
   public SpanishLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianCharFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianCharFilterFactory.java
index 1f59ecf..1084e50 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianCharFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianCharFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.CharFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PersianCharFilterFactory extends CharFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "persian";
+
   /** Creates a new PersianCharFilterFactory */
   public PersianCharFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianNormalizationFilterFactory.java
index 256b501..1801bd3 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fa/PersianNormalizationFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PersianNormalizationFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "persianNormalization";
   
   /** Creates a new PersianNormalizationFilterFactory */
   public PersianNormalizationFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemFilterFactory.java
index 02719ff..e8311ae 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class FinnishLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "finnishLightStem";
   
   /** Creates a new FinnishLightStemFilterFactory */
   public FinnishLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemFilterFactory.java
index 1f957d2..368289f 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class FrenchLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "frenchLightStem";
   
   /** Creates a new FrenchLightStemFilterFactory */
   public FrenchLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemFilterFactory.java
index b6e91a2..08f7071 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemFilterFactory.java
@@ -34,8 +34,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class FrenchMinimalStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "frenchMinimalStem";
   
   /** Creates a new FrenchMinimalStemFilterFactory */
   public FrenchMinimalStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ga/IrishLowerCaseFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ga/IrishLowerCaseFilterFactory.java
index abaad3d..2e551a5 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ga/IrishLowerCaseFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ga/IrishLowerCaseFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class IrishLowerCaseFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "irishLowerCase";
+
   /** Creates a new IrishLowerCaseFilterFactory */
   public IrishLowerCaseFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianMinimalStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianMinimalStemFilterFactory.java
index c739c7e..6c63583 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianMinimalStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianMinimalStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class GalicianMinimalStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "galicianMinimalStem";
   
   /** Creates a new GalicianMinimalStemFilterFactory */
   public GalicianMinimalStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianStemFilterFactory.java
index bd4bcf1..0d11dac 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/gl/GalicianStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class GalicianStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "galicianStem";
   
   /** Creates a new GalicianStemFilterFactory */
   public GalicianStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiNormalizationFilterFactory.java
index fbc0a24..8c366fd 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiNormalizationFilterFactory.java
@@ -32,8 +32,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class HindiNormalizationFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "hindiNormalization";
   
   /** Creates a new HindiNormalizationFilterFactory */
   public HindiNormalizationFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiStemFilterFactory.java
index e0562a4..32f5287 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hi/HindiStemFilterFactory.java
@@ -32,8 +32,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class HindiStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "hindiStem";
   
   /** Creates a new HindiStemFilterFactory */
   public HindiStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemFilterFactory.java
index 6720fd1..3b57a40 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class HungarianLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "hungarianLightStem";
   
   /** Creates a new HungarianLightStemFilterFactory */
   public HungarianLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/HunspellStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/HunspellStemFilterFactory.java
index 3e9b9ba..73de215 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/HunspellStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/HunspellStemFilterFactory.java
@@ -49,8 +49,13 @@ import org.apache.lucene.util.IOUtils;
  * See <a href="http://wiki.apache.org/solr/Hunspell">http://wiki.apache.org/solr/Hunspell</a>
  * @lucene.experimental
  * @since 3.5.0
+ * @lucene.spi {@value #NAME}
  */
 public class HunspellStemFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "hunspellStem";
+
   private static final String PARAM_DICTIONARY    = "dictionary";
   private static final String PARAM_AFFIX         = "affix";
   // NOTE: this one is currently unused?:
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/id/IndonesianStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/id/IndonesianStemFilterFactory.java
index d81426b..f975418 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/id/IndonesianStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/id/IndonesianStemFilterFactory.java
@@ -33,8 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class IndonesianStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "indonesianStem";
+
   private final boolean stemDerivational;
 
   /** Creates a new IndonesianStemFilterFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/in/IndicNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/in/IndicNormalizationFilterFactory.java
index e4a6900..d7391d1 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/in/IndicNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/in/IndicNormalizationFilterFactory.java
@@ -32,8 +32,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class IndicNormalizationFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "indicNormalization";
   
   /** Creates a new IndicNormalizationFilterFactory */
   public IndicNormalizationFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemFilterFactory.java
index 2c324a4..53f56bf 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre> 
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class ItalianLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "italianLightStem";
   
   /** Creates a new ItalianLightStemFilterFactory */
   public ItalianLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/lv/LatvianStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/lv/LatvianStemFilterFactory.java
index 0be2828..b00a3c1 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/lv/LatvianStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/lv/LatvianStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.2.0
+ * @lucene.spi {@value #NAME}
  */
 public class LatvianStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "latvianStem";
   
   /** Creates a new LatvianStemFilterFactory */
   public LatvianStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/minhash/MinHashFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/minhash/MinHashFilterFactory.java
index f93f65b..70132f2 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/minhash/MinHashFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/minhash/MinHashFilterFactory.java
@@ -25,8 +25,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
 /**
  * {@link TokenFilterFactory} for {@link MinHashFilter}.
  * @since 6.2.0
+ * @lucene.spi {@value #NAME}
  */
 public class MinHashFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "minHash";
+
   private int hashCount = MinHashFilter.DEFAULT_HASH_COUNT;
   
   private int bucketCount = MinHashFilter.DEFAULT_BUCKET_COUNT;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilterFactory.java
index 4dabd88..8a3a803 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilterFactory.java
@@ -33,8 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ASCIIFoldingFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "asciiFolding";
+
   private static final String PRESERVE_ORIGINAL = "preserveOriginal";
 
   private final boolean preserveOriginal;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CapitalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CapitalizationFilterFactory.java
index 0397de7..f0c7988 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CapitalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CapitalizationFilterFactory.java
@@ -56,8 +56,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since solr 1.3
+ * @lucene.spi {@value #NAME}
  */
 public class CapitalizationFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "capitalization";
+
   public static final String KEEP = "keep";
   public static final String KEEP_IGNORE_CASE = "keepIgnoreCase";
   public static final String OK_PREFIX = "okPrefix";
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CodepointCountFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CodepointCountFilterFactory.java
index abadf25..2f13dc6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CodepointCountFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/CodepointCountFilterFactory.java
@@ -32,8 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.5.1
+ * @lucene.spi {@value #NAME}
  */
 public class CodepointCountFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "codepointCount";
+
   final int min;
   final int max;
   public static final String MIN_KEY = "min";
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConcatenateGraphFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConcatenateGraphFilterFactory.java
index 5d8ccba..2b0aab9 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConcatenateGraphFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConcatenateGraphFilterFactory.java
@@ -44,9 +44,13 @@ import org.apache.lucene.util.automaton.TooComplexToDeterminizeException;
  * </ul>
  * @see ConcatenateGraphFilter
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class ConcatenateGraphFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "concatenateGraph";
+
   private boolean preserveSep;
   private boolean preservePositionIncrements;
   private int maxGraphExpansions;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConditionalTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConditionalTokenFilterFactory.java
index 6296082..deddbc6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConditionalTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ConditionalTokenFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * Abstract parent class for analysis factories that create {@link ConditionalTokenFilter} instances
  *
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public abstract class ConditionalTokenFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
 
+  /** SPI name */
+  public static final String NAME = "conditional";
+
   private List<TokenFilterFactory> innerFilters;
 
   protected ConditionalTokenFilterFactory(Map<String, String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DateRecognizerFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DateRecognizerFilterFactory.java
index 7a426c5..4e0a2ad 100755
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DateRecognizerFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DateRecognizerFilterFactory.java
@@ -42,9 +42,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * format of the system. The {@code locale} is optional and if omitted the filter will be created with
  * {@link Locale#ENGLISH}.
  * @since 5.5.0
+ * @lucene.spi {@value #NAME}
  */
 public class DateRecognizerFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "dateRecognizer";
+
   public static final String DATE_PATTERN = "datePattern";
   public static final String LOCALE = "locale";
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DelimitedTermFrequencyTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DelimitedTermFrequencyTokenFilterFactory.java
index 422da77..a9479c1 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DelimitedTermFrequencyTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/DelimitedTermFrequencyTokenFilterFactory.java
@@ -32,8 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class DelimitedTermFrequencyTokenFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "delimitedTermFrequency";
+
   public static final String DELIMITER_ATTR = "delimiter";
 
   private final char delimiter;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FingerprintFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FingerprintFilterFactory.java
index 70bc668..89556c5 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FingerprintFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FingerprintFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * {@link FingerprintFilter} for an explanation of its use.
  * </pre>
  * @since 5.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class FingerprintFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "fingerprint";
+
   public static final String MAX_OUTPUT_TOKEN_SIZE_KEY = "maxOutputTokenSize";
   public static final String SEPARATOR_KEY = "separator";
   final int maxOutputTokenSize;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FixBrokenOffsetsFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FixBrokenOffsetsFilterFactory.java
index 1f58841..04503e4 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FixBrokenOffsetsFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/FixBrokenOffsetsFilterFactory.java
@@ -25,9 +25,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
 /**
  * Factory for {@link FixBrokenOffsetsFilter}.
  * @since 7.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class FixBrokenOffsetsFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "fixBrokenOffsets";
+
   /** Sole constructor */
   public FixBrokenOffsetsFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/HyphenatedWordsFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/HyphenatedWordsFilterFactory.java
index f55a49d..3b9804a 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/HyphenatedWordsFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/HyphenatedWordsFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class HyphenatedWordsFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "hyphenatedWords";
   
   /** Creates a new HyphenatedWordsFilterFactory */
   public HyphenatedWordsFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeepWordFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeepWordFilterFactory.java
index b1c4bae..64a83ca 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeepWordFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeepWordFilterFactory.java
@@ -37,8 +37,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class KeepWordFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "keepWord";
+
   private final boolean ignoreCase;
   private final String wordFiles;
   private CharArraySet words;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordMarkerFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordMarkerFilterFactory.java
index e9293bc..efc0159 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordMarkerFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordMarkerFilterFactory.java
@@ -37,8 +37,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class KeywordMarkerFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "keywordMarker";
+
   public static final String PROTECTED_TOKENS = "protected";
   public static final String PATTERN = "pattern";
   private final String wordFiles;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordRepeatFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordRepeatFilterFactory.java
index 900b357..717a7ee 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordRepeatFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/KeywordRepeatFilterFactory.java
@@ -29,8 +29,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * later in the analysis chain will be in the document twice. Therefore, consider adding
  * {@link RemoveDuplicatesTokenFilterFactory} later in the analysis chain.
  * @since 4.3.0
+ * @lucene.spi {@value #NAME}
  */
 public final class KeywordRepeatFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "keywordRepeat";
   
   /** Creates a new KeywordRepeatFilterFactory */
   public KeywordRepeatFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LengthFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LengthFilterFactory.java
index 29d789d..01f4b77 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LengthFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LengthFilterFactory.java
@@ -33,8 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class LengthFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "length";
+
   final int min;
   final int max;
   public static final String MIN_KEY = "min";
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenCountFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenCountFilterFactory.java
index 547bd9b..b36aab0 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenCountFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenCountFilterFactory.java
@@ -35,9 +35,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * The {@code consumeAllTokens} property is optional and defaults to {@code false}.  
  * See {@link LimitTokenCountFilter} for an explanation of its use.
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class LimitTokenCountFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "limitTokenCount";
+
   public static final String MAX_TOKEN_COUNT_KEY = "maxTokenCount";
   public static final String CONSUME_ALL_TOKENS_KEY = "consumeAllTokens";
   final int maxTokenCount;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenOffsetFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenOffsetFilterFactory.java
index fd01e87..954be4b 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenOffsetFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenOffsetFilterFactory.java
@@ -34,9 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * <p>
  * The {@code consumeAllTokens} property is optional and defaults to {@code false}.
  * @since 5.2.0
+ * @lucene.spi {@value #NAME}
  */
 public class LimitTokenOffsetFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "limitTokenOffset";
+
   public static final String MAX_START_OFFSET = "maxStartOffset";
   public static final String CONSUME_ALL_TOKENS_KEY = "consumeAllTokens";
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenPositionFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenPositionFilterFactory.java
index a6c055b..8b5bdf2 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenPositionFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/LimitTokenPositionFilterFactory.java
@@ -34,9 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * The {@code consumeAllTokens} property is optional and defaults to {@code false}.  
  * See {@link LimitTokenPositionFilter} for an explanation of its use.
  * @since 4.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class LimitTokenPositionFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "limitTokenPosition";
+
   public static final String MAX_TOKEN_POSITION_KEY = "maxTokenPosition";
   public static final String CONSUME_ALL_TOKENS_KEY = "consumeAllTokens";
   final int maxTokenPosition;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ProtectedTermFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ProtectedTermFilterFactory.java
index c528996..65c8edf 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ProtectedTermFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ProtectedTermFilterFactory.java
@@ -77,9 +77,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * <p>See related {@link org.apache.lucene.analysis.custom.CustomAnalyzer.Builder#whenTerm(Predicate)}
  *
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class ProtectedTermFilterFactory extends ConditionalTokenFilterFactory implements ResourceLoaderAware {
 
+  public static final String NAME = "protectedTerm";
+
   public static final String PROTECTED_TERMS = "protected";
   public static final char FILTER_ARG_SEPARATOR = '.';
   public static final char FILTER_NAME_ID_SEPARATOR = '-';
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/RemoveDuplicatesTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/RemoveDuplicatesTokenFilterFactory.java
index 0c97245..70a3678 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/RemoveDuplicatesTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/RemoveDuplicatesTokenFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class RemoveDuplicatesTokenFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "removeDuplicates";
   
   /** Creates a new RemoveDuplicatesTokenFilterFactory */
   public RemoveDuplicatesTokenFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilterFactory.java
index ae6465d..62beb64 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class ScandinavianFoldingFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "scandinavianFolding";
+
   public ScandinavianFoldingFilterFactory(Map<String,String> args) {
     super(args);
     if (!args.isEmpty()) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilterFactory.java
index f58d42d..3d40daa 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilterFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class ScandinavianNormalizationFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "scandinavianNormalization";
+
   public ScandinavianNormalizationFilterFactory(Map<String, String> args) {
     super(args);
     if (!args.isEmpty()) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/StemmerOverrideFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/StemmerOverrideFilterFactory.java
index eb6654c..9373454 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/StemmerOverrideFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/StemmerOverrideFilterFactory.java
@@ -37,8 +37,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class StemmerOverrideFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "stemmerOverride";
+
   private StemmerOverrideMap dictionary;
   private final String dictionaryFiles;
   private final boolean ignoreCase;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TrimFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TrimFilterFactory.java
index 4f00e41..285fc72 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TrimFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TrimFilterFactory.java
@@ -35,8 +35,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * @see TrimFilter
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class TrimFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "trim";
   
   /** Creates a new TrimFilterFactory */
   public TrimFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TruncateTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TruncateTokenFilterFactory.java
index 83800cd..1c37d1e 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TruncateTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TruncateTokenFilterFactory.java
@@ -37,9 +37,13 @@ import java.util.Map;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.8.0
+ * @lucene.spi {@value #NAME}
  */
 public class TruncateTokenFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "truncate";
+
   public static final String PREFIX_LENGTH_KEY = "prefixLength";
   private final byte prefixLength;
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TypeAsSynonymFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TypeAsSynonymFilterFactory.java
index 8487877..8dc0c46 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TypeAsSynonymFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/TypeAsSynonymFilterFactory.java
@@ -38,8 +38,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * the emitted synonym will have text "_type_&lt;URL&gt;".
  *
  * @since 7.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class TypeAsSynonymFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "typeAsSynonym";
+
   private final String prefix;
 
   public TypeAsSynonymFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterFilterFactory.java
index 8e29ac2..3cd13e4 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterFilterFactory.java
@@ -54,9 +54,14 @@ import static org.apache.lucene.analysis.miscellaneous.WordDelimiterFilter.*;
  * the search time analyzer.
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 @Deprecated
 public class WordDelimiterFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "wordDelimiter";
+
   public static final String PROTECTED_TOKENS = "protected";
   public static final String TYPES = "types";
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterGraphFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterGraphFilterFactory.java
index 4666c7d..7b936f6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterGraphFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/WordDelimiterGraphFilterFactory.java
@@ -49,8 +49,13 @@ import static org.apache.lucene.analysis.miscellaneous.WordDelimiterIterator.*;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 6.5.0
+ * @lucene.spi {@value #NAME}
  */
 public class WordDelimiterGraphFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "wordDelimiterGraph";
+
   public static final String PROTECTED_TOKENS = "protected";
   public static final String TYPES = "types";
   public static final String OFFSETS = "adjustOffsets";
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramFilterFactory.java
index efabafb..6b02208 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramFilterFactory.java
@@ -34,8 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class EdgeNGramFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "edgeNGram";
+
   private final int maxGramSize;
   private final int minGramSize;
   private final boolean preserveOriginal;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramTokenizerFactory.java
index 4cc3d2f..4ba1a47 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/EdgeNGramTokenizerFactory.java
@@ -33,8 +33,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class EdgeNGramTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "edgeNGram";
+
   private final int maxGramSize;
   private final int minGramSize;
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramFilterFactory.java
index a04a107..3c9c4d2 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramFilterFactory.java
@@ -34,8 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class NGramFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "nGram";
+
   private final int maxGramSize;
   private final int minGramSize;
   private final boolean preserveOriginal;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramTokenizerFactory.java
index b6c55ba..12d60d7 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ngram/NGramTokenizerFactory.java
@@ -35,8 +35,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class NGramTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "nGram";
+
   private final int maxGramSize;
   private final int minGramSize;
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianLightStemFilterFactory.java
index 5f6be56..b4f54e3 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianLightStemFilterFactory.java
@@ -36,8 +36,12 @@ import static org.apache.lucene.analysis.no.NorwegianLightStemmer.NYNORSK;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class NorwegianLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "norwegianLightStem";
   
   private final int flags;
   
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianMinimalStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianMinimalStemFilterFactory.java
index 03d5090..d07ad47 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianMinimalStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/no/NorwegianMinimalStemFilterFactory.java
@@ -36,8 +36,12 @@ import static org.apache.lucene.analysis.no.NorwegianLightStemmer.NYNORSK;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class NorwegianMinimalStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "norwegianMinimalStem";
   
   private final int flags;
   
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/path/PathHierarchyTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/path/PathHierarchyTokenizerFactory.java
index aebd6bd..cbe3092 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/path/PathHierarchyTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/path/PathHierarchyTokenizerFactory.java
@@ -68,8 +68,13 @@ import org.apache.lucene.util.AttributeFactory;
  * </pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PathHierarchyTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "pathHierarchy";
+
   private final char delimiter;
   private final char replacement;
   private final boolean reverse;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternCaptureGroupFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternCaptureGroupFilterFactory.java
index d0df49b..20ce2f6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternCaptureGroupFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternCaptureGroupFilterFactory.java
@@ -35,8 +35,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *
  * @see PatternCaptureGroupTokenFilter
  * @since 4.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class PatternCaptureGroupFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "patternCaptureGroup";
+
   private Pattern pattern;
   private boolean preserveOriginal = true;
   
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceCharFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceCharFilterFactory.java
index 6b71c76..99b5ae8 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceCharFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceCharFilterFactory.java
@@ -35,8 +35,13 @@ import org.apache.lucene.analysis.util.CharFilterFactory;
  * &lt;/fieldType&gt;</pre>
  * 
  * @since Solr 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PatternReplaceCharFilterFactory extends CharFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "patternReplace";
+
   private final Pattern pattern;
   private final String replacement;
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceFilterFactory.java
index 8c4572c..03d6642 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternReplaceFilterFactory.java
@@ -38,8 +38,13 @@ import java.util.regex.Pattern;
  * @see PatternReplaceFilter
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PatternReplaceFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "patternReplace";
+
   final Pattern pattern;
   final String replacement;
   final boolean replaceAll;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternTokenizerFactory.java
index b919dae..2a79482 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/PatternTokenizerFactory.java
@@ -57,8 +57,13 @@ import org.apache.lucene.util.AttributeFactory;
  * 
  * @see PatternTokenizer
  * @since solr1.2
+ * @lucene.spi {@value #NAME}
  */
 public class PatternTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "pattern";
+
   public static final String PATTERN = "pattern";
   public static final String GROUP = "group";
  
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternSplitTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternSplitTokenizerFactory.java
index 200a975..5518ed8 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternSplitTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternSplitTokenizerFactory.java
@@ -55,8 +55,13 @@ import org.apache.lucene.util.automaton.RegExp;
  * @see SimplePatternSplitTokenizer
  *
  * @since 6.5.0
+ * @lucene.spi {@value #NAME}
  */
 public class SimplePatternSplitTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "simplePatternSplit";
+
   public static final String PATTERN = "pattern";
   private final Automaton dfa;
   private final int maxDeterminizedStates;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternTokenizerFactory.java
index 5c73ad8..b605115 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pattern/SimplePatternTokenizerFactory.java
@@ -55,8 +55,13 @@ import org.apache.lucene.util.automaton.RegExp;
  * @see SimplePatternTokenizer
  *
  * @since 6.5.0
+ * @lucene.spi {@value #NAME}
  */
 public class SimplePatternTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "simplePattern";
+
   public static final String PATTERN = "pattern";
   private final Automaton dfa;
   private final int maxDeterminizedStates;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/DelimitedPayloadTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/DelimitedPayloadTokenFilterFactory.java
index f0bcd02..f55293c 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/DelimitedPayloadTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/DelimitedPayloadTokenFilterFactory.java
@@ -35,8 +35,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class DelimitedPayloadTokenFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "delimitedPayload";
+
   public static final String ENCODER_ATTR = "encoder";
   public static final String DELIMITER_ATTR = "delimiter";
 
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/NumericPayloadTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/NumericPayloadTokenFilterFactory.java
index 0d3a23f..be2ad6c 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/NumericPayloadTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/NumericPayloadTokenFilterFactory.java
@@ -32,8 +32,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class NumericPayloadTokenFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "numericPayload";
+
   private final float payload;
   private final String typeMatch;
   
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TokenOffsetPayloadTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TokenOffsetPayloadTokenFilterFactory.java
index 1836f96..5518eff 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TokenOffsetPayloadTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TokenOffsetPayloadTokenFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class TokenOffsetPayloadTokenFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "tokenOffsetPayload";
   
   /** Creates a new TokenOffsetPayloadTokenFilterFactory */
   public TokenOffsetPayloadTokenFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TypeAsPayloadTokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TypeAsPayloadTokenFilterFactory.java
index 5209758..016176d 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TypeAsPayloadTokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/payloads/TypeAsPayloadTokenFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class TypeAsPayloadTokenFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "typeAsPayload";
   
   /** Creates a new TypeAsPayloadTokenFilterFactory */
   public TypeAsPayloadTokenFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemFilterFactory.java
index 1060179..8bfca4c 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class PortugueseLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "portugueseLightStem";
   
   /** Creates a new PortugueseLightStemFilterFactory */
   public PortugueseLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseMinimalStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseMinimalStemFilterFactory.java
index 15b4fd0..cab3174 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseMinimalStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseMinimalStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class PortugueseMinimalStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "portugueseMinimalStem";
   
   /** Creates a new PortugueseMinimalStemFilterFactory */
   public PortugueseMinimalStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseStemFilterFactory.java
index c9e082f..cbdf1dd 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class PortugueseStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "portugueseStem";
   
   /** Creates a new PortugueseStemFilterFactory */
   public PortugueseStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilterFactory.java
index f186b95..c51018d 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/reverse/ReverseStringFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since solr 1.4
+ * @lucene.spi {@value #NAME}
  */
 public class ReverseStringFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "reverseString";
   
   /** Creates a new ReverseStringFilterFactory */
   public ReverseStringFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemFilterFactory.java
index 64769a3..673db07 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class RussianLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "russianLightStem";
   
   /** Creates a new RussianLightStemFilterFactory */
   public RussianLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/FixedShingleFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/FixedShingleFilterFactory.java
index 0176d1c..83ae485 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/FixedShingleFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/FixedShingleFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * </ul>
  *
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class FixedShingleFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "fixedShingle";
+
   private final int shingleSize;
   private final String tokenSeparator;
   private final String fillerToken;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/ShingleFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/ShingleFilterFactory.java
index 3c86e9b..612a5d9 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/ShingleFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/shingle/ShingleFilterFactory.java
@@ -34,8 +34,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ShingleFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "shingle";
+
   private final int minShingleSize;
   private final int maxShingleSize;
   private final boolean outputUnigrams;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java
index 181f7ad..f61d732 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java
@@ -43,8 +43,13 @@ import org.tartarus.snowball.SnowballProgram;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class SnowballPorterFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "snowballPorter";
+
   public static final String PROTECTED_TOKENS = "protected";
 
   private final String language;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/sr/SerbianNormalizationFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/sr/SerbianNormalizationFilterFactory.java
index c47d471..e2f87ca 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/sr/SerbianNormalizationFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/sr/SerbianNormalizationFilterFactory.java
@@ -35,8 +35,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre> 
  * @since 5.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class SerbianNormalizationFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "serbianNormalization";
+
   final String haircut;
 
   /** Creates a new SerbianNormalizationFilterFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicFilterFactory.java
index a81dcd6..2eff55c 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class ClassicFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "classic";
   
   /** Creates a new ClassicFilterFactory */
   public ClassicFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicTokenizerFactory.java
index 04c1fd6..83ac4d5 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/ClassicTokenizerFactory.java
@@ -32,8 +32,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ClassicTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "classic";
+
   private final int maxTokenLength;
 
   /** Creates a new ClassicTokenizerFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/StandardTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/StandardTokenizerFactory.java
index 74467a2..2866bae 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/StandardTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/StandardTokenizerFactory.java
@@ -32,8 +32,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre> 
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class StandardTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "standard";
+
   private final int maxTokenLength;
   
   /** Creates a new StandardTokenizerFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/UAX29URLEmailTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/UAX29URLEmailTokenizerFactory.java
index 526f5f6..250fd14 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/UAX29URLEmailTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/UAX29URLEmailTokenizerFactory.java
@@ -32,8 +32,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;</pre> 
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class UAX29URLEmailTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "uaX29UrlEmail";
+
   private final int maxTokenLength;
 
   /** Creates a new UAX29URLEmailTokenizerFactory */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemFilterFactory.java
index c7eb119..dd9bb9a 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemFilterFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class SwedishLightStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "swedishLightStem";
   
   /** Creates a new SwedishLightStemFilterFactory */
   public SwedishLightStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymFilterFactory.java
index b0addcf..c9e575a 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymFilterFactory.java
@@ -78,9 +78,14 @@ import org.apache.lucene.analysis.util.TokenizerFactory;
  * use {@link FlattenGraphFilterFactory} at index time (not at search time) as well.
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 @Deprecated
 public class SynonymFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "synonym";
+
   private final boolean ignoreCase;
   private final String tokenizerFactory;
   private final String synonyms;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymGraphFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymGraphFilterFactory.java
index 4fe68bc..f94f687 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymGraphFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/synonym/SynonymGraphFilterFactory.java
@@ -74,8 +74,13 @@ import org.apache.lucene.analysis.util.TokenizerFactory;
  *
  * @lucene.experimental
  * @since 6.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class SynonymGraphFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "synonymGraph";
+
   private final boolean ignoreCase;
   private final String tokenizerFactory;
   private final String synonyms;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/th/ThaiTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/th/ThaiTokenizerFactory.java
index 04c91e7..f798d15 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/th/ThaiTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/th/ThaiTokenizerFactory.java
@@ -33,8 +33,12 @@ import org.apache.lucene.util.AttributeFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 4.10.0
+ * @lucene.spi {@value #NAME}
  */
 public class ThaiTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "thai";
   
   /** Creates a new ThaiTokenizerFactory */
   public ThaiTokenizerFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/ApostropheFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/ApostropheFilterFactory.java
index 47161ae..6543978 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/ApostropheFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/ApostropheFilterFactory.java
@@ -33,9 +33,13 @@ import java.util.Map;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 4.8.0
+ * @lucene.spi {@value #NAME}
  */
 public class ApostropheFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "apostrophe";
+
   public ApostropheFilterFactory(Map<String, String> args) {
     super(args);
     if (!args.isEmpty()) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/TurkishLowerCaseFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/TurkishLowerCaseFilterFactory.java
index be43d34..d5152b6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/TurkishLowerCaseFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/tr/TurkishLowerCaseFilterFactory.java
@@ -32,8 +32,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class TurkishLowerCaseFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "turkishLowerCase";
   
   /** Creates a new TurkishLowerCaseFilterFactory */
   public TurkishLowerCaseFilterFactory(Map<String,String> args) {
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java
index 13f5028..8e79c3e 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java
@@ -17,15 +17,18 @@
 package org.apache.lucene.analysis.util;
 
 
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
+import java.lang.reflect.Modifier;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.LinkedHashMap;
 import java.util.Set;
 import java.util.ServiceConfigurationError;
+import java.util.regex.Pattern;
 
 import org.apache.lucene.util.SPIClassIterator;
 
@@ -36,24 +39,17 @@ import org.apache.lucene.util.SPIClassIterator;
 public final class AnalysisSPILoader<S extends AbstractAnalysisFactory> {
 
   private volatile Map<String,Class<? extends S>> services = Collections.emptyMap();
+  private volatile Set<String> originalNames = Collections.emptySet();
   private final Class<S> clazz;
-  private final String[] suffixes;
-  
-  public AnalysisSPILoader(Class<S> clazz) {
-    this(clazz, new String[] { clazz.getSimpleName() });
-  }
 
-  public AnalysisSPILoader(Class<S> clazz, ClassLoader loader) {
-    this(clazz, new String[] { clazz.getSimpleName() }, loader);
-  }
+  private static final Pattern SERVICE_NAME_PATTERN = Pattern.compile("^[a-zA-Z][a-zA-Z0-9_]+$");
 
-  public AnalysisSPILoader(Class<S> clazz, String[] suffixes) {
-    this(clazz, suffixes, null);
+  public AnalysisSPILoader(Class<S> clazz) {
+    this(clazz, null);
   }
-  
-  public AnalysisSPILoader(Class<S> clazz, String[] suffixes, ClassLoader classloader) {
+
+  public AnalysisSPILoader(Class<S> clazz, ClassLoader classloader) {
     this.clazz = clazz;
-    this.suffixes = suffixes;
     // if clazz' classloader is not a parent of the given one, we scan clazz's classloader, too:
     final ClassLoader clazzClassloader = clazz.getClassLoader();
     if (classloader == null) {
@@ -64,7 +60,7 @@ public final class AnalysisSPILoader<S extends AbstractAnalysisFactory> {
     }
     reload(classloader);
   }
-  
+
   /** 
    * Reloads the internal SPI list from the given {@link ClassLoader}.
    * Changes to the service list are visible after the method ends, all
@@ -78,22 +74,35 @@ public final class AnalysisSPILoader<S extends AbstractAnalysisFactory> {
    */
   public synchronized void reload(ClassLoader classloader) {
     Objects.requireNonNull(classloader, "classloader");
-    final LinkedHashMap<String,Class<? extends S>> services =
-      new LinkedHashMap<>(this.services);
+    final LinkedHashMap<String,Class<? extends S>> services = new LinkedHashMap<>(this.services);
+    final LinkedHashSet<String> originalNames = new LinkedHashSet<>(this.originalNames);
     final SPIClassIterator<S> loader = SPIClassIterator.get(clazz, classloader);
     while (loader.hasNext()) {
       final Class<? extends S> service = loader.next();
-      final String clazzName = service.getSimpleName();
       String name = null;
-      for (String suffix : suffixes) {
-        if (clazzName.endsWith(suffix)) {
-          name = clazzName.substring(0, clazzName.length() - suffix.length()).toLowerCase(Locale.ROOT);
-          break;
+      String originalName = null;
+      Throwable cause = null;
+      try {
+        // Lookup "NAME" field with appropriate modifiers.
+        // Also it must be a String class and declared in the service class.
+        final Field field = service.getField("NAME");
+        int modifier = field.getModifiers();
+        if (Modifier.isStatic(modifier) && Modifier.isFinal(modifier) &&
+            field.getType().equals(String.class) &&
+            Objects.equals(field.getDeclaringClass(), service)) {
+          originalName = ((String)field.get(null));
+          name = originalName.toLowerCase(Locale.ROOT);
+          if (!isValidName(originalName)) {
+            throw new ServiceConfigurationError("The name " + originalName + " for " + service.getName() +
+                " is invalid: Allowed characters are (English) alphabet, digits, and underscore. It should be started with an alphabet.");
+          }
         }
+      } catch (NoSuchFieldException | IllegalAccessException e) {
+        cause = e;
       }
       if (name == null) {
         throw new ServiceConfigurationError("The class name " + service.getName() +
-          " has wrong suffix, allowed are: " + Arrays.toString(suffixes));
+            " has no service name field: [public static final String NAME]", cause);
       }
       // only add the first one for each name, later services will be ignored
       // this allows to place services before others in classpath to make 
@@ -105,11 +114,26 @@ public final class AnalysisSPILoader<S extends AbstractAnalysisFactory> {
       // When changing this be careful to allow reload()!
       if (!services.containsKey(name)) {
         services.put(name, service);
+        // preserve (case-sensitive) original name for reference
+        originalNames.add(originalName);
       }
     }
-    this.services = Collections.unmodifiableMap(services);
+
+    // make sure that the number of lookup keys is same to the number of original names.
+    // in fact this constraint should be met in existence checks of the lookup map key,
+    // so this is more like an assertion rather than a status check.
+    if (services.keySet().size() != originalNames.size()) {
+      throw new ServiceConfigurationError("Service lookup key set is inconsistent with original name set!");
+    }
+
+    this.services = Map.copyOf(services);
+    this.originalNames = Set.copyOf(originalNames);
   }
-  
+
+  private boolean isValidName(String name) {
+    return SERVICE_NAME_PATTERN.matcher(name).matches();
+  }
+
   public S newInstance(String name, Map<String,String> args) {
     final Class<? extends S> service = lookupClass(name);
     return newFactoryClassInstance(service, args);
@@ -127,7 +151,7 @@ public final class AnalysisSPILoader<S extends AbstractAnalysisFactory> {
   }
 
   public Set<String> availableServices() {
-    return services.keySet();
+    return originalNames;
   }  
   
   /** Creates a new instance of the given {@link AbstractAnalysisFactory} by invoking the constructor, passing the given argument map. */
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/ElisionFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/ElisionFilterFactory.java
index 3e67c3c..ee4e9ee 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/ElisionFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/ElisionFilterFactory.java
@@ -37,8 +37,13 @@ import org.apache.lucene.analysis.fr.FrenchAnalyzer;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ElisionFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "elision";
+
   private final String articlesFile;
   private final boolean ignoreCase;
   private CharArraySet articles;
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/TokenFilterFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/TokenFilterFactory.java
index f18b4de..72c4070 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/TokenFilterFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/TokenFilterFactory.java
@@ -31,9 +31,8 @@ import org.apache.lucene.analysis.TokenStream;
 public abstract class TokenFilterFactory extends AbstractAnalysisFactory {
 
   private static final AnalysisSPILoader<TokenFilterFactory> loader =
-      new AnalysisSPILoader<>(TokenFilterFactory.class,
-          new String[] { "TokenFilterFactory", "FilterFactory" });
-  
+      new AnalysisSPILoader<>(TokenFilterFactory.class);
+
   /** looks up a tokenfilter by name from context classpath */
   public static TokenFilterFactory forName(String name, Map<String,String> args) {
     return loader.newInstance(name, args);
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/wikipedia/WikipediaTokenizerFactory.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/wikipedia/WikipediaTokenizerFactory.java
index e9833af..b2cedb6 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/wikipedia/WikipediaTokenizerFactory.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/wikipedia/WikipediaTokenizerFactory.java
@@ -33,8 +33,13 @@ import org.apache.lucene.util.AttributeFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class WikipediaTokenizerFactory extends TokenizerFactory {
+
+  /** SPI name */
+  public static final String NAME = "wikipedia";
+
   public static final String TOKEN_OUTPUT = "tokenOutput";
   public static final String UNTOKENIZED_TYPES = "untokenizedTypes";
 
diff --git a/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java b/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java
index 098b98b..2398c1e 100644
--- a/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java
+++ b/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestAnalysisSPILoader.java
@@ -30,7 +30,7 @@ import org.apache.lucene.util.Version;
 public class TestAnalysisSPILoader extends LuceneTestCase {
   
   private Map<String,String> versionArgOnly() {
-    return new HashMap<String,String>() {{
+    return new HashMap<String, String>() {{
       put("luceneMatchVersion", Version.LATEST.toString());
     }};
   }
@@ -113,7 +113,7 @@ public class TestAnalysisSPILoader extends LuceneTestCase {
   
   public void testAvailableTokenFilters() {
     assertTrue(TokenFilterFactory.availableTokenFilters().contains("lowercase"));
-    assertTrue(TokenFilterFactory.availableTokenFilters().contains("removeduplicates"));
+    assertTrue(TokenFilterFactory.availableTokenFilters().contains("removeDuplicates"));
   }
   
   public void testLookupCharFilter() {
@@ -149,6 +149,6 @@ public class TestAnalysisSPILoader extends LuceneTestCase {
   }
   
   public void testAvailableCharFilters() {
-    assertTrue(CharFilterFactory.availableCharFilters().contains("htmlstrip"));
+    assertTrue(CharFilterFactory.availableCharFilters().contains("htmlStrip"));
   }
 }
diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUFoldingFilterFactory.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUFoldingFilterFactory.java
index 8825c66..b6e7df2 100644
--- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUFoldingFilterFactory.java
+++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUFoldingFilterFactory.java
@@ -35,8 +35,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class ICUFoldingFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "icuFolding";
+
   private final Normalizer2 normalizer;
 
   /** Creates a new ICUFoldingFilterFactory */
diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2CharFilterFactory.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2CharFilterFactory.java
index 57a8ee1..8a4db89 100644
--- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2CharFilterFactory.java
+++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2CharFilterFactory.java
@@ -43,8 +43,13 @@ import org.apache.lucene.analysis.util.CharFilterFactory;
  * @see FilteredNormalizer2
  *
  * @since 4.10.0
+ * @lucene.spi {@value #NAME}
  */
 public class ICUNormalizer2CharFilterFactory extends CharFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "icuNormalizer2";
+
   private final Normalizer2 normalizer;
 
   /** Creates a new ICUNormalizer2CharFilterFactory */
diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2FilterFactory.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2FilterFactory.java
index 93b9f40..d4e1ecd 100644
--- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2FilterFactory.java
+++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUNormalizer2FilterFactory.java
@@ -42,8 +42,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * @see Normalizer2
  * @see FilteredNormalizer2
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class ICUNormalizer2FilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "icuNormalizer2";
+
   private final Normalizer2 normalizer;
 
   /** Creates a new ICUNormalizer2FilterFactory */
diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUTransformFilterFactory.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUTransformFilterFactory.java
index b70d477..b2b24dd 100644
--- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUTransformFilterFactory.java
+++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/ICUTransformFilterFactory.java
@@ -34,8 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * </ul>
  * @see Transliterator
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
 public class ICUTransformFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "icuTransform";
+
   private final Transliterator transliterator;
   
   // TODO: add support for custom rules
diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ICUTokenizerFactory.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ICUTokenizerFactory.java
index b57117e..b2e3446 100644
--- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ICUTokenizerFactory.java
+++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/ICUTokenizerFactory.java
@@ -74,8 +74,13 @@ import com.ibm.icu.text.RuleBasedBreakIterator;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ICUTokenizerFactory extends TokenizerFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "icu";
+
   static final String RULEFILES = "rulefiles";
   private final Map<Integer,String> tailored;
   private ICUTokenizerConfig config;
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseBaseFormFilterFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseBaseFormFilterFactory.java
index 504953b..5d59b11 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseBaseFormFilterFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseBaseFormFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;
  * </pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapaneseBaseFormFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "japaneseBaseForm";
+
   /** Creates a new JapaneseBaseFormFilterFactory */
   public JapaneseBaseFormFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseIterationMarkCharFilterFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseIterationMarkCharFilterFactory.java
index 568989a..c865a73 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseIterationMarkCharFilterFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseIterationMarkCharFilterFactory.java
@@ -33,9 +33,13 @@ import org.apache.lucene.analysis.util.CharFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 4.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapaneseIterationMarkCharFilterFactory extends CharFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "japaneseIterationMark";
+
   private static final String NORMALIZE_KANJI_PARAM = "normalizeKanji";
   private static final String NORMALIZE_KANA_PARAM = "normalizeKana";
 
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseKatakanaStemFilterFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseKatakanaStemFilterFactory.java
index d5b240b..7ba5df9 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseKatakanaStemFilterFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseKatakanaStemFilterFactory.java
@@ -34,8 +34,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;
  * </pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapaneseKatakanaStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "japaneseKatakanaStem";
+
   private static final String MINIMUM_LENGTH_PARAM = "minimumLength";
   private final int minimumLength;
   
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseNumberFilterFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseNumberFilterFactory.java
index 471f6cb..2584266 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseNumberFilterFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseNumberFilterFactory.java
@@ -37,9 +37,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * It is important that punctuation is not discarded by the tokenizer so use
  * {@code discardPunctuation="false"} in your {@link JapaneseTokenizerFactory}.
  * @since 6.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapaneseNumberFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "japaneseNumber";
+
   public JapaneseNumberFilterFactory(Map<String, String> args) {
     super(args);
     if (!args.isEmpty()) {
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapanesePartOfSpeechStopFilterFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapanesePartOfSpeechStopFilterFactory.java
index 059457f..6ca368f 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapanesePartOfSpeechStopFilterFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapanesePartOfSpeechStopFilterFactory.java
@@ -40,8 +40,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;
  * </pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapanesePartOfSpeechStopFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  public static final String NAME = "japanesePartOfSpeechStop";
+
   private final String stopTagFiles;
   private Set<String> stopTags;
 
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseReadingFormFilterFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseReadingFormFilterFactory.java
index 082eae8..f23aac7 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseReadingFormFilterFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseReadingFormFilterFactory.java
@@ -34,8 +34,13 @@ import java.util.Map;
  * &lt;/fieldType&gt;
  * </pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapaneseReadingFormFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "japaneseReadingForm";
+
   private static final String ROMAJI_PARAM = "useRomaji";
   private final boolean useRomaji;
   
diff --git a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseTokenizerFactory.java b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseTokenizerFactory.java
index a45b3c1..1eaecd7 100644
--- a/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseTokenizerFactory.java
+++ b/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseTokenizerFactory.java
@@ -78,8 +78,13 @@ import org.apache.lucene.analysis.util.ResourceLoaderAware;
  * modes, but it makes the most sense to use them with NORMAL mode.
  *
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class JapaneseTokenizerFactory extends TokenizerFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "japanese";
+
   private static final String MODE = "mode";
 
   private static final String USER_DICT_PATH = "userDictionary";
diff --git a/lucene/analysis/morfologik/src/java/org/apache/lucene/analysis/morfologik/MorfologikFilterFactory.java b/lucene/analysis/morfologik/src/java/org/apache/lucene/analysis/morfologik/MorfologikFilterFactory.java
index 4afc370..8b2841c 100644
--- a/lucene/analysis/morfologik/src/java/org/apache/lucene/analysis/morfologik/MorfologikFilterFactory.java
+++ b/lucene/analysis/morfologik/src/java/org/apache/lucene/analysis/morfologik/MorfologikFilterFactory.java
@@ -49,8 +49,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * 
  * @see <a href="http://morfologik.blogspot.com/">Morfologik web site</a>
  * @since 4.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class MorfologikFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "morfologik";
+
   /** Dictionary resource attribute (should have {@code ".dict"} suffix), loaded from {@link ResourceLoader}. */
   public static final String DICTIONARY_ATTRIBUTE = "dictionary";
 
diff --git a/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanPartOfSpeechStopFilterFactory.java b/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanPartOfSpeechStopFilterFactory.java
index b79ecac..c60848f 100644
--- a/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanPartOfSpeechStopFilterFactory.java
+++ b/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanPartOfSpeechStopFilterFactory.java
@@ -43,8 +43,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * @lucene.experimental
  *
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class KoreanPartOfSpeechStopFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "koreanPartOfSpeechStop";
+
   private Set<POS.Tag> stopTags;
 
   /** Creates a new KoreanPartOfSpeechStopFilterFactory */
diff --git a/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanReadingFormFilterFactory.java b/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanReadingFormFilterFactory.java
index 2225a1d..1a08df1 100644
--- a/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanReadingFormFilterFactory.java
+++ b/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanReadingFormFilterFactory.java
@@ -34,9 +34,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * @lucene.experimental
  *
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class KoreanReadingFormFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "koreanReadingForm";
+
   /** Creates a new KoreanReadingFilterFactory */
   public KoreanReadingFormFilterFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanTokenizerFactory.java b/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanTokenizerFactory.java
index f722273..f63922d 100644
--- a/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanTokenizerFactory.java
+++ b/lucene/analysis/nori/src/java/org/apache/lucene/analysis/ko/KoreanTokenizerFactory.java
@@ -62,8 +62,13 @@ import org.apache.lucene.analysis.ko.KoreanTokenizer.DecompoundMode;
  * @lucene.experimental
  *
  * @since 7.4.0
+ * @lucene.spi {@value #NAME}
  */
 public class KoreanTokenizerFactory extends TokenizerFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "korean";
+
   private static final String USER_DICT_PATH = "userDictionary";
   private static final String USER_DICT_ENCODING = "userDictionaryEncoding";
   private static final String DECOMPOUND_MODE = "decompoundMode";
diff --git a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPChunkerFilterFactory.java b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPChunkerFilterFactory.java
index 96eb672..b723c7a 100644
--- a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPChunkerFilterFactory.java
+++ b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPChunkerFilterFactory.java
@@ -39,8 +39,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class OpenNLPChunkerFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "openNlpChunker";
+
   public static final String CHUNKER_MODEL = "chunkerModel";
 
   private final String chunkerModelFile;
diff --git a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPLemmatizerFilterFactory.java b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPLemmatizerFilterFactory.java
index 90a0e43..bb2aa0f 100644
--- a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPLemmatizerFilterFactory.java
+++ b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPLemmatizerFilterFactory.java
@@ -43,8 +43,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class OpenNLPLemmatizerFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "openNlpLemmatizer";
+
   public static final String DICTIONARY = "dictionary";
   public static final String LEMMATIZER_MODEL = "lemmatizerModel";
 
diff --git a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPPOSFilterFactory.java b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPPOSFilterFactory.java
index 952218f..873f005 100644
--- a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPPOSFilterFactory.java
+++ b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPPOSFilterFactory.java
@@ -37,8 +37,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class OpenNLPPOSFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "openNlppos";
+
   public static final String POS_TAGGER_MODEL = "posTaggerModel";
 
   private final String posTaggerModelFile;
diff --git a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPTokenizerFactory.java b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPTokenizerFactory.java
index a60f23f..1e46083 100644
--- a/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPTokenizerFactory.java
+++ b/lucene/analysis/opennlp/src/java/org/apache/lucene/analysis/opennlp/OpenNLPTokenizerFactory.java
@@ -38,8 +38,13 @@ import org.apache.lucene.util.AttributeFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 7.3.0
+ * @lucene.spi {@value #NAME}
  */
 public class OpenNLPTokenizerFactory extends TokenizerFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "openNlp";
+
   public static final String SENTENCE_MODEL = "sentenceModel";
   public static final String TOKENIZER_MODEL = "tokenizerModel";
 
diff --git a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/BeiderMorseFilterFactory.java b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/BeiderMorseFilterFactory.java
index d13e052..566f86c 100644
--- a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/BeiderMorseFilterFactory.java
+++ b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/BeiderMorseFilterFactory.java
@@ -40,8 +40,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *   &lt;/analyzer&gt;
  * &lt;/fieldType&gt;</pre>
  * @since 3.6.0
+ * @lucene.spi {@value #NAME}
  */
 public class BeiderMorseFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "beiderMorse";
+
   private final PhoneticEngine engine;
   private final LanguageSet languageSet;
   
diff --git a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DaitchMokotoffSoundexFilterFactory.java b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DaitchMokotoffSoundexFilterFactory.java
index a304324..5931038 100644
--- a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DaitchMokotoffSoundexFilterFactory.java
+++ b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DaitchMokotoffSoundexFilterFactory.java
@@ -43,8 +43,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *
  * @lucene.experimental
  * @since 5.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class DaitchMokotoffSoundexFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "daitchMokotoffSoundex";
+
   /** parameter name: true if encoded tokens should be added as synonyms */
   public static final String INJECT = "inject"; // boolean
 
diff --git a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DoubleMetaphoneFilterFactory.java b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DoubleMetaphoneFilterFactory.java
index 112944a..c261743 100644
--- a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DoubleMetaphoneFilterFactory.java
+++ b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/DoubleMetaphoneFilterFactory.java
@@ -33,9 +33,14 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class DoubleMetaphoneFilterFactory extends TokenFilterFactory
 {
+
+  /** SPI name */
+  public static final String NAME = "doubleMetaphone";
+
   /** parameter name: true if encoded tokens should be added as synonyms */
   public static final String INJECT = "inject"; 
   /** parameter name: restricts the length of the phonetic code */
diff --git a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java
index e580d6e..8d5ae5a 100644
--- a/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java
+++ b/lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java
@@ -64,8 +64,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * @see PhoneticFilter
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class PhoneticFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "phonetic";
+
   /** parameter name: either a short name or a full class name */
   public static final String ENCODER = "encoder";
   /** parameter name: true if encoded tokens should be added as synonyms */
diff --git a/lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/HMMChineseTokenizerFactory.java b/lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/HMMChineseTokenizerFactory.java
index 5d30459..545f27c 100644
--- a/lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/HMMChineseTokenizerFactory.java
+++ b/lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/HMMChineseTokenizerFactory.java
@@ -32,9 +32,13 @@ import org.apache.lucene.util.AttributeFactory;
  * @lucene.experimental
  *
  * @since 4.10.0
+ * @lucene.spi {@value #NAME}
  */
 public final class HMMChineseTokenizerFactory extends TokenizerFactory {
 
+  /** SPI name */
+  public static final String NAME = "hmmChinese";
+
   /** Creates a new HMMChineseTokenizerFactory */
   public HMMChineseTokenizerFactory(Map<String,String> args) {
     super(args);
diff --git a/lucene/analysis/stempel/src/java/org/apache/lucene/analysis/stempel/StempelPolishStemFilterFactory.java b/lucene/analysis/stempel/src/java/org/apache/lucene/analysis/stempel/StempelPolishStemFilterFactory.java
index 3b6e286..c3d6f0c 100644
--- a/lucene/analysis/stempel/src/java/org/apache/lucene/analysis/stempel/StempelPolishStemFilterFactory.java
+++ b/lucene/analysis/stempel/src/java/org/apache/lucene/analysis/stempel/StempelPolishStemFilterFactory.java
@@ -26,8 +26,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
 /**
  * Factory for {@link StempelFilter} using a Polish stemming table.
  * @since 3.1.0
+ * @lucene.spi {@value #NAME}
  */
-public class StempelPolishStemFilterFactory extends TokenFilterFactory {  
+public class StempelPolishStemFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "stempelPolishStem";
   
   /** Creates a new StempelPolishStemFilterFactory */
   public StempelPolishStemFilterFactory(Map<String,String> args) {
diff --git a/lucene/common-build.xml b/lucene/common-build.xml
index 2262050..ff2ad42 100644
--- a/lucene/common-build.xml
+++ b/lucene/common-build.xml
@@ -2119,6 +2119,8 @@ ${ant.project.name}.test.dependencies=${test.classpath.list}
           description="WARNING: This API is experimental and might change in incompatible ways in the next release."/>
         <tag name="lucene.internal"
         description="NOTE: This API is for internal purposes only and might change in incompatible ways in the next release."/>
+        <tag name="lucene.spi"
+        description="SPI Name (Note: This is case-insensitive. e.g., if the name is 'htmlStrip', 'htmlstrip' can be used when looking up the service):" scope="types"/>
         <link offline="true" packagelistLoc="${javadoc.dir}"/>
         <link offline="true" href="${javadoc.link}" packagelistLoc="${javadoc.packagelist.dir}/java11"/>
         <bottom><![CDATA[
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/SuggestStopFilterFactory.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/SuggestStopFilterFactory.java
index 2ea52f6..22e4c39 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/SuggestStopFilterFactory.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/SuggestStopFilterFactory.java
@@ -71,8 +71,13 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  *  </li>
  * </ul>
  * @since 5.0.0
+ * @lucene.spi {@value #NAME}
  */
-  public class SuggestStopFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+public class SuggestStopFilterFactory extends TokenFilterFactory implements ResourceLoaderAware {
+
+  /** SPI name */
+  public static final String NAME = "suggestStop";
+
   /** the default format, one word per line, whole line comments start with "#" */
   public static final String FORMAT_WORDSET = "wordset";
   /** multiple words may be specified on each line, trailing comments start with "&#124;" */
diff --git a/lucene/tools/src/groovy/check-source-patterns.groovy b/lucene/tools/src/groovy/check-source-patterns.groovy
index ccfcc49..7794963 100644
--- a/lucene/tools/src/groovy/check-source-patterns.groovy
+++ b/lucene/tools/src/groovy/check-source-patterns.groovy
@@ -75,6 +75,7 @@ def blockBoundaryPattern = ~$/----\s*/$;
 def blockTitlePattern = ~$/\..*/$;
 def unescapedSymbolPattern = ~$/(?<=[^\\]|^)([-=]>|<[-=])/$; // SOLR-10883
 def extendsLuceneTestCasePattern = ~$/public.*?class.*?extends.*?LuceneTestCase[^\n]*?\n/$;
+def validSPINameJavadocTag = ~$/(?s)\s*\*\s*@lucene\.spi\s+\{@value #NAME\}/$;
 
 def isLicense = { matcher, ratDocument ->
   licenseMatcher.reset();
@@ -177,6 +178,16 @@ ant.fileScanner{
         reportViolation(f, 'invalid logger name [log, uses static class name, not specialized logger]')
       }
     }
+    // make sure that SPI names of all tokenizers/charfilters/tokenfilters are documented
+    if (!f.name.contains("Test") && !f.name.contains("Mock") && !text.contains("abstract class") &&
+        !f.name.equals("TokenizerFactory.java") && !f.name.equals("CharFilterFactory.java") && !f.name.equals("TokenFilterFactory.java") &&
+        (f.name.contains("TokenizerFactory") && text.contains("extends TokenizerFactory") ||
+            f.name.contains("CharFilterFactory") && text.contains("extends CharFilterFactory") ||
+            f.name.contains("FilterFactory") && text.contains("extends TokenFilterFactory"))) {
+      if (!validSPINameJavadocTag.matcher(text).find()) {
+        reportViolation(f, 'invalid spi name documentation')
+      }
+    }
     checkLicenseHeaderPrecedes(f, 'package', packagePattern, javaCommentPattern, text, ratDocument);
     if (f.name.contains("Test")) {
       checkMockitoAssume(f, text);
diff --git a/solr/core/src/java/org/apache/solr/analysis/LowerCaseTokenizerFactory.java b/solr/core/src/java/org/apache/solr/analysis/LowerCaseTokenizerFactory.java
index 953d046..4f14a7f 100644
--- a/solr/core/src/java/org/apache/solr/analysis/LowerCaseTokenizerFactory.java
+++ b/solr/core/src/java/org/apache/solr/analysis/LowerCaseTokenizerFactory.java
@@ -41,10 +41,14 @@ import static org.apache.lucene.analysis.standard.StandardTokenizer.MAX_TOKEN_LE
  * else {@link CharTokenizer}::DEFAULT_MAX_WORD_LEN</li>
  * </ul>
  * @deprecated Use {@link org.apache.lucene.analysis.core.LetterTokenizerFactory} and {@link LowerCaseFilterFactory}
+ * @lucene.spi {@value #NAME}
  */
 @Deprecated
 public class LowerCaseTokenizerFactory extends TokenizerFactory {
 
+  /** SPI name */
+  public static final String NAME = "lowercase";
+
   private final int maxTokenLen;
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/analysis/ReversedWildcardFilterFactory.java b/solr/core/src/java/org/apache/solr/analysis/ReversedWildcardFilterFactory.java
index a1917b8..a71cd0e 100644
--- a/solr/core/src/java/org/apache/solr/analysis/ReversedWildcardFilterFactory.java
+++ b/solr/core/src/java/org/apache/solr/analysis/ReversedWildcardFilterFactory.java
@@ -61,8 +61,12 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
  * &lt;/fieldType&gt;</pre>
  *
  * @since 3.1
+ * @lucene.spi {@value #NAME}
  */
 public class ReversedWildcardFilterFactory extends TokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "reversedWildcard";
   
   private char markerChar = ReverseStringFilter.START_OF_HEADING_MARKER;
   private boolean withOriginal;
diff --git a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedStopFilterFactory.java b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedStopFilterFactory.java
index 5b6fcb7..29f3476 100644
--- a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedStopFilterFactory.java
+++ b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedStopFilterFactory.java
@@ -29,9 +29,13 @@ import org.apache.solr.rest.ManagedResource;
  * TokenFilterFactory that uses the ManagedWordSetResource implementation
  * for managing stop words using the REST API.
  * @since 4.8.0
+ * @lucene.spi {@value #NAME}
  */
 public class ManagedStopFilterFactory extends BaseManagedTokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "managedStop";
+
   // this only gets changed once during core initialization and not every
   // time an update is made to the underlying managed word set.
   private CharArraySet stopWords = null;
diff --git a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java
index 259e4cd..8d77c53 100644
--- a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java
+++ b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java
@@ -55,9 +55,13 @@ import org.slf4j.LoggerFactory;
  * @deprecated Use {@link ManagedSynonymGraphFilterFactory} instead, but be sure to also
  * use {@link FlattenGraphFilterFactory} at index time (not at search time) as well.
  * @since 4.8.0
+ * @lucene.spi {@value #NAME}
  */
 @Deprecated
 public class ManagedSynonymFilterFactory extends BaseManagedTokenFilterFactory {
+
+  /** SPI name */
+  public static final String NAME = "managedSynonym";
   
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
diff --git a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymGraphFilterFactory.java b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymGraphFilterFactory.java
index caef307..80d6a70 100644
--- a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymGraphFilterFactory.java
+++ b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymGraphFilterFactory.java
@@ -51,9 +51,13 @@ import org.slf4j.LoggerFactory;
  * TokenFilterFactory and ManagedResource implementation for 
  * doing CRUD on synonyms using the REST API.
  * @since 7.0.0
+ * @lucene.spi {@value #NAME}
  */
 public class ManagedSynonymGraphFilterFactory extends BaseManagedTokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "managedSynonymGraph";
+
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public static final String SYNONYM_MAPPINGS = "synonymMappings";
diff --git a/solr/core/src/test/org/apache/solr/handler/tagger/WordLengthTaggingFilterFactory.java b/solr/core/src/test/org/apache/solr/handler/tagger/WordLengthTaggingFilterFactory.java
index dbfc538..c0db6cf 100644
--- a/solr/core/src/test/org/apache/solr/handler/tagger/WordLengthTaggingFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/handler/tagger/WordLengthTaggingFilterFactory.java
@@ -30,8 +30,14 @@ import org.apache.lucene.analysis.util.TokenFilterFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * @lucene.spi {@value #NAME}
+ */
 public class WordLengthTaggingFilterFactory extends TokenFilterFactory {
 
+  /** SPI name */
+  public static final String NAME = "wordLengthTagging";
+
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public static final String MIN_LENGTH = "minLength";