52
52
import org .elasticsearch .index .analysis .IndexAnalyzers ;
53
53
import org .elasticsearch .index .analysis .MultiTermAwareComponent ;
54
54
import org .elasticsearch .index .analysis .NamedAnalyzer ;
55
+ import org .elasticsearch .index .analysis .ReferringFilterFactory ;
55
56
import org .elasticsearch .index .analysis .TokenFilterFactory ;
56
57
import org .elasticsearch .index .analysis .TokenizerFactory ;
57
58
import org .elasticsearch .index .mapper .KeywordFieldMapper ;
@@ -574,6 +575,7 @@ private static List<TokenFilterFactory> parseTokenFilterFactories(AnalyzeRequest
574
575
Environment environment , Tuple <String , TokenizerFactory > tokenizerFactory ,
575
576
List <CharFilterFactory > charFilterFactoryList , boolean normalizer ) throws IOException {
576
577
List <TokenFilterFactory > tokenFilterFactoryList = new ArrayList <>();
578
+ List <ReferringFilterFactory > referringFilters = new ArrayList <>();
577
579
if (request .tokenFilters () != null && request .tokenFilters ().size () > 0 ) {
578
580
List <AnalyzeRequest .NameOrDefinition > tokenFilters = request .tokenFilters ();
579
581
for (AnalyzeRequest .NameOrDefinition tokenFilter : tokenFilters ) {
@@ -594,7 +596,9 @@ private static List<TokenFilterFactory> parseTokenFilterFactories(AnalyzeRequest
594
596
tokenFilterFactory = tokenFilterFactoryFactory .get (getNaIndexSettings (settings ), environment , "_anonymous_tokenfilter" , settings );
595
597
tokenFilterFactory = CustomAnalyzerProvider .checkAndApplySynonymFilter (tokenFilterFactory , tokenizerFactory .v1 (), tokenizerFactory .v2 (), tokenFilterFactoryList ,
596
598
charFilterFactoryList , environment );
597
-
599
+ if (tokenFilterFactory instanceof ReferringFilterFactory ) {
600
+ referringFilters .add ((ReferringFilterFactory )tokenFilterFactory );
601
+ }
598
602
599
603
} else {
600
604
AnalysisModule .AnalysisProvider <TokenFilterFactory > tokenFilterFactoryFactory ;
@@ -629,6 +633,26 @@ private static List<TokenFilterFactory> parseTokenFilterFactories(AnalyzeRequest
629
633
tokenFilterFactoryList .add (tokenFilterFactory );
630
634
}
631
635
}
636
+ if (referringFilters .isEmpty () == false ) {
637
+ // The request included at least one custom referring tokenfilter that has not already been built by the
638
+ // analysis registry, so we need to set its references. Note that this will only apply pre-built
639
+ // tokenfilters
640
+ if (indexSettings == null ) {
641
+ Settings settings = Settings .builder ()
642
+ .put (IndexMetaData .SETTING_VERSION_CREATED , Version .CURRENT )
643
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 )
644
+ .put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , 1 )
645
+ .put (IndexMetaData .SETTING_INDEX_UUID , UUIDs .randomBase64UUID ())
646
+ .build ();
647
+ IndexMetaData metaData = IndexMetaData .builder (IndexMetaData .INDEX_UUID_NA_VALUE ).settings (settings ).build ();
648
+ indexSettings = new IndexSettings (metaData , Settings .EMPTY );
649
+ }
650
+ Map <String , TokenFilterFactory > prebuiltFilters = analysisRegistry .buildTokenFilterFactories (indexSettings );
651
+ for (ReferringFilterFactory rff : referringFilters ) {
652
+ rff .setReferences (prebuiltFilters );
653
+ }
654
+
655
+ }
632
656
return tokenFilterFactoryList ;
633
657
}
634
658
0 commit comments