{"record":{"id":"95abb5ab76ee0106","repo":"elastic/elasticsearch","slug":"token-type-custom-requires-setting-custom-toke","errorCode":null,"errorMessage":"Token type: 'custom' requires setting `custom_token_chars`","messagePattern":"Token type: 'custom' requires setting `custom_token_chars`","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/analysis-common/src/main/java/org/elasticsearch/analysis/common/NGramTokenizerFactory.java","lineNumber":86,"sourceCode":"        }\n        CharMatcher.Builder builder = new CharMatcher.Builder();\n        for (String characterClass : characterClasses) {\n            characterClass = characterClass.toLowerCase(Locale.ROOT).trim();\n            CharMatcher matcher = MATCHERS.get(characterClass);\n            if (matcher == null) {\n                if (characterClass.equals(\"custom\") == false) {\n                    throw new IllegalArgumentException(\n                        \"Unknown token type: '\"\n                            + characterClass\n                            + \"', must be one of \"\n                            + Stream.of(MATCHERS.keySet(), Collections.singleton(\"custom\"))\n                                .flatMap(x -> x.stream())\n                                .collect(Collectors.toSet())\n                    );\n                }\n                String customCharacters = settings.get(\"custom_token_chars\");\n                if (customCharacters == null) {\n                    throw new IllegalArgumentException(\"Token type: 'custom' requires setting `custom_token_chars`\");\n                }\n                final Set<Integer> customCharSet = customCharacters.chars().boxed().collect(Collectors.toSet());\n                matcher = customCharSet::contains;\n            }\n            builder.or(matcher);\n        }\n        return builder.build();\n    }\n\n    NGramTokenizerFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {\n        super(name);\n        int maxAllowedNgramDiff = indexSettings.getMaxNgramDiff();\n        this.minGram = settings.getAsInt(\"min_gram\", NGramTokenizer.DEFAULT_MIN_NGRAM_SIZE);\n        this.maxGram = settings.getAsInt(\"max_gram\", NGramTokenizer.DEFAULT_MAX_NGRAM_SIZE);\n        int ngramDiff = maxGram - minGram;\n        if (ngramDiff > maxAllowedNgramDiff) {\n            throw new IllegalArgumentException(\n                \"The difference between max_gram and min_gram in NGram Tokenizer must be less than or equal to: [\"","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/modules/analysis-common/src/main/java/org/elasticsearch/analysis/common/NGramTokenizerFactory.java#L68-L104","documentation":"Error \"Token type: 'custom' requires setting `custom_token_chars`\" thrown in elastic/elasticsearch.","triggerScenarios":"Thrown at modules/analysis-common/src/main/java/org/elasticsearch/analysis/common/NGramTokenizerFactory.java:86 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T12:31:55.035Z"}