diff --git a/server/src/main/java/org/opensearch/index/search/QueryParserHelper.java b/server/src/main/java/org/opensearch/index/search/QueryParserHelper.java index 603e81f6bf113..992408273424a 100644 --- a/server/src/main/java/org/opensearch/index/search/QueryParserHelper.java +++ b/server/src/main/java/org/opensearch/index/search/QueryParserHelper.java @@ -52,6 +52,16 @@ * @opensearch.internal */ public final class QueryParserHelper { + + private static SearchService searchService; + + public static void setSearchService(SearchService service) { + if (searchService != null) { + return; // already initialized + } + searchService = service; + } + private QueryParserHelper() {} /** @@ -180,7 +190,7 @@ static Map resolveMappingField( } static void checkForTooManyFields(int numberOfFields, QueryShardContext context, @Nullable String inputPattern) { - int limit = SearchService.INDICES_MAX_CLAUSE_COUNT_SETTING.get(context.getIndexSettings().getSettings()); + int limit = searchService.getFieldExpansionLimit(); if (numberOfFields > limit) { StringBuilder errorMsg = new StringBuilder("field expansion "); if (inputPattern != null) { diff --git a/server/src/main/java/org/opensearch/search/SearchService.java b/server/src/main/java/org/opensearch/search/SearchService.java index bc83688983a70..02a132aef1cb1 100644 --- a/server/src/main/java/org/opensearch/search/SearchService.java +++ b/server/src/main/java/org/opensearch/search/SearchService.java @@ -159,6 +159,7 @@ import org.opensearch.threadpool.ThreadPool.Names; import org.opensearch.transport.TransportRequest; import org.opensearch.wlm.WorkloadGroupService; +import org.opensearch.index.search.QueryParserHelper; import java.io.IOException; import java.util.ArrayList; @@ -515,6 +516,12 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv private final Executor indexSearcherExecutor; private final TaskResourceTrackingService taskResourceTrackingService; + private volatile int fieldExpansionLimit; + + public int getFieldExpansionLimit() { + return fieldExpansionLimit; + } + private final List pluginProfilers; public SearchService( @@ -583,7 +590,12 @@ public SearchService( clusterService.getClusterSettings().addSettingsUpdateConsumer(LOW_LEVEL_CANCELLATION_SETTING, this::setLowLevelCancellation); IndexSearcher.setMaxClauseCount(INDICES_MAX_CLAUSE_COUNT_SETTING.get(settings)); - clusterService.getClusterSettings().addSettingsUpdateConsumer(INDICES_MAX_CLAUSE_COUNT_SETTING, IndexSearcher::setMaxClauseCount); + this.fieldExpansionLimit = INDICES_MAX_CLAUSE_COUNT_SETTING.get(clusterService.getSettings()); + clusterService.getClusterSettings() + .addSettingsUpdateConsumer(INDICES_MAX_CLAUSE_COUNT_SETTING, value -> { + IndexSearcher.setMaxClauseCount(value); + this.fieldExpansionLimit = value; + }); QueryStringQueryParser.setMaxQueryStringLength(SEARCH_MAX_QUERY_STRING_LENGTH.get(settings)); clusterService.getClusterSettings() @@ -600,6 +612,8 @@ public SearchService( this.concurrentSearchDeciderFactories = concurrentSearchDeciderFactories; + QueryParserHelper.setSearchService(this); + this.pluginProfilers = pluginProfilers; // Initialize QueryRewriterRegistry with cluster settings so TermsMergingRewriter