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 .AllFieldMapper ;
@@ -553,6 +554,7 @@ private static List<TokenFilterFactory> parseTokenFilterFactories(AnalyzeRequest
553
554
Environment environment , Tuple <String , TokenizerFactory > tokenizerFactory ,
554
555
List <CharFilterFactory > charFilterFactoryList , boolean normalizer ) throws IOException {
555
556
List <TokenFilterFactory > tokenFilterFactoryList = new ArrayList <>();
557
+ List <ReferringFilterFactory > referringFilters = new ArrayList <>();
556
558
if (request .tokenFilters () != null && request .tokenFilters ().size () > 0 ) {
557
559
List <AnalyzeRequest .NameOrDefinition > tokenFilters = request .tokenFilters ();
558
560
for (AnalyzeRequest .NameOrDefinition tokenFilter : tokenFilters ) {
@@ -573,7 +575,9 @@ private static List<TokenFilterFactory> parseTokenFilterFactories(AnalyzeRequest
573
575
tokenFilterFactory = tokenFilterFactoryFactory .get (getNaIndexSettings (settings ), environment , "_anonymous_tokenfilter" , settings );
574
576
tokenFilterFactory = CustomAnalyzerProvider .checkAndApplySynonymFilter (tokenFilterFactory , tokenizerFactory .v1 (), tokenizerFactory .v2 (), tokenFilterFactoryList ,
575
577
charFilterFactoryList , environment );
576
-
578
+ if (tokenFilterFactory instanceof ReferringFilterFactory ) {
579
+ referringFilters .add ((ReferringFilterFactory )tokenFilterFactory );
580
+ }
577
581
578
582
} else {
579
583
AnalysisModule .AnalysisProvider <TokenFilterFactory > tokenFilterFactoryFactory ;
@@ -608,6 +612,26 @@ private static List<TokenFilterFactory> parseTokenFilterFactories(AnalyzeRequest
608
612
tokenFilterFactoryList .add (tokenFilterFactory );
609
613
}
610
614
}
615
+ if (referringFilters .isEmpty () == false ) {
616
+ // The request included at least one custom referring tokenfilter that has not already been built by the
617
+ // analysis registry, so we need to set its references. Note that this will only apply pre-built
618
+ // tokenfilters
619
+ if (indexSettings == null ) {
620
+ Settings settings = Settings .builder ()
621
+ .put (IndexMetaData .SETTING_VERSION_CREATED , Version .CURRENT )
622
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 )
623
+ .put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , 1 )
624
+ .put (IndexMetaData .SETTING_INDEX_UUID , UUIDs .randomBase64UUID ())
625
+ .build ();
626
+ IndexMetaData metaData = IndexMetaData .builder (IndexMetaData .INDEX_UUID_NA_VALUE ).settings (settings ).build ();
627
+ indexSettings = new IndexSettings (metaData , Settings .EMPTY );
628
+ }
629
+ Map <String , TokenFilterFactory > prebuiltFilters = analysisRegistry .buildTokenFilterFactories (indexSettings );
630
+ for (ReferringFilterFactory rff : referringFilters ) {
631
+ rff .setReferences (prebuiltFilters );
632
+ }
633
+
634
+ }
611
635
return tokenFilterFactoryList ;
612
636
}
613
637
0 commit comments