Skip to content

Commit 89e6932

Browse files
authored
[Feature branch] Add Neural Stats API (#1208)
* Add neural stats Signed-off-by: Andy Qin <[email protected]> * Refactor event/state stats Signed-off-by: Andy Qin <[email protected]> * Extend state stats and refactor stat combination Signed-off-by: Andy Qin <[email protected]> * Fix rest integ test Signed-off-by: Andy Qin <[email protected]> * Add stats and nodes filtering Signed-off-by: Andy Qin <[email protected]> * Add flatten and include metadata query parameter Signed-off-by: Andy Qin <[email protected]> * Add EventStatData to snapshot EventStat info Signed-off-by: Andy Qin <[email protected]> * Refactor stat filtering Signed-off-by: Andy Qin <[email protected]> * Add stat aggregations, metadata Signed-off-by: Andy Qin <[email protected]> * Add trailing interval and minutes since last event metadata Signed-off-by: Andy Qin <[email protected]> * Reorganize response processing logic Signed-off-by: Andy Qin <[email protected]> * Add enable stats setting and reset Signed-off-by: Andy Qin <[email protected]> * Adding documentation for state and event stats Signed-off-by: Andy Qin <[email protected]> * More documentation Signed-off-by: Andy Qin <[email protected]> * Clean up unused state stats manager methods Signed-off-by: Andy Qin <[email protected]> * Add unit tests and update ITs Signed-off-by: Andy Qin <[email protected]> * Add transport tests, refactor toXContent tests Signed-off-by: Andy Qin <[email protected]> * Clean up files Signed-off-by: Andy Qin <[email protected]> * Update changelog Signed-off-by: Andy Qin <[email protected]> * Address review comments Signed-off-by: Andy Qin <[email protected]> * Reformat response Signed-off-by: Andy Qin <[email protected]> * Add bwc tests for stats Signed-off-by: Andy Qin <[email protected]> * Add parameter validation Signed-off-by: Andy Qin <[email protected]> * Use readOptionalEnumSet from core Signed-off-by: Andy Qin <[email protected]> * Clean up files Signed-off-by: Andy Qin <[email protected]> --------- Signed-off-by: Andy Qin <[email protected]>
1 parent 57124dd commit 89e6932

File tree

48 files changed

+4075
-6
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+4075
-6
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
## [Unreleased 3.x](https://github.com/opensearch-project/neural-search/compare/main...HEAD)
77
### Features
88
- Lower bound for min-max normalization technique in hybrid query ([#1195](https://github.com/opensearch-project/neural-search/pull/1195))
9+
- Add stats API ([#1208](https://github.com/opensearch-project/neural-search/pull/1208))
910
### Enhancements
1011
### Bug Fixes
1112
### Infrastructure

qa/restart-upgrade/build.gradle

+19
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ def versionsBelow2_13 = versionsBelow2_12 + "2.12"
6161
def versionsBelow2_14 = versionsBelow2_13 + "2.13"
6262
def versionsBelow2_15 = versionsBelow2_14 + "2.14"
6363
def versionsBelow2_16 = versionsBelow2_15 + "2.15"
64+
def versionsBelow2_17 = versionsBelow2_16 + "2.16"
65+
def versionsBelow2_18 = versionsBelow2_17 + "2.17"
66+
def versionsBelow2_19 = versionsBelow2_18 + "2.18"
67+
def versionsBelow2_20 = versionsBelow2_19 + "2.19"
68+
def versionsBelow3_0 = versionsBelow2_20 + "2.20"
6469

6570
// Task to run BWC tests against the old cluster
6671
task testAgainstOldCluster(type: StandaloneRestIntegTestTask) {
@@ -114,6 +119,13 @@ task testAgainstOldCluster(type: StandaloneRestIntegTestTask) {
114119
}
115120
}
116121

122+
// Excluding stats tests because we introduce this feature in 3.0
123+
if (versionsBelow3_0.any { ext.neural_search_bwc_version.startsWith(it) }){
124+
filter {
125+
excludeTestsMatching "org.opensearch.neuralsearch.bwc.restart.RestNeuralStatsActionIT.*"
126+
}
127+
}
128+
117129
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
118130
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")
119131
systemProperty 'tests.security.manager', 'false'
@@ -179,6 +191,13 @@ task testAgainstNewCluster(type: StandaloneRestIntegTestTask) {
179191
}
180192
}
181193

194+
// Excluding stats tests because we introduce this feature in 3.0
195+
if (versionsBelow3_0.any { ext.neural_search_bwc_version.startsWith(it) }){
196+
filter {
197+
excludeTestsMatching "org.opensearch.neuralsearch.bwc.restart.RestNeuralStatsActionIT.*"
198+
}
199+
}
200+
182201
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
183202
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")
184203
systemProperty 'tests.security.manager', 'false'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package org.opensearch.neuralsearch.bwc.restart;
6+
7+
import org.opensearch.neuralsearch.stats.events.EventStatName;
8+
import org.opensearch.neuralsearch.stats.info.InfoStatName;
9+
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.util.ArrayList;
13+
import java.util.Map;
14+
15+
import static org.opensearch.neuralsearch.util.TestUtils.NODES_BWC_CLUSTER;
16+
import static org.opensearch.neuralsearch.util.TestUtils.TEXT_EMBEDDING_PROCESSOR;
17+
import static org.opensearch.neuralsearch.util.TestUtils.getModelId;
18+
19+
public class RestNeuralStatsActionIT extends AbstractRestartUpgradeRestTestCase {
20+
private static final String PIPELINE_NAME = "nlp-pipeline";
21+
private static final String TEST_FIELD = "passage_text";
22+
private static final String TEXT = "Hello world";
23+
private static final String TEXT_1 = "Hello world a";
24+
25+
// Test restart-upgrade with neural stats
26+
// Enabled/disabled settings should persist between restarts
27+
// Event stats should be reset on restart
28+
// Info stats based on persistent constructs should be persisted between restarts
29+
public void testNeuralStats_E2EFlow() throws Exception {
30+
waitForClusterHealthGreen(NODES_BWC_CLUSTER);
31+
updateClusterSettings("plugins.neural_search.stats_enabled", true);
32+
33+
// Currently using text embedding processor executions stat since that's the only one implemented
34+
// Once other stats are implemented, it may be smarter to use those instead of text embedding processor
35+
// to avoid having to upload a model and run inference.
36+
if (isRunningAgainstOldCluster()) {
37+
String modelId = uploadTextEmbeddingModel();
38+
loadModel(modelId);
39+
createPipelineProcessor(modelId, PIPELINE_NAME);
40+
createIndexWithConfiguration(
41+
getIndexNameForTest(),
42+
Files.readString(Path.of(classLoader.getResource("processor/IndexMappingMultipleShard.json").toURI())),
43+
PIPELINE_NAME
44+
);
45+
addDocument(getIndexNameForTest(), "0", TEST_FIELD, TEXT, null, null);
46+
47+
// Get stats request
48+
String responseBody = executeNeuralStatRequest(new ArrayList<>(), new ArrayList<>());
49+
Map<String, Object> infoStats = parseInfoStatsResponse(responseBody);
50+
Map<String, Object> aggregatedNodeStats = parseAggregatedNodeStatsResponse(responseBody);
51+
52+
assertEquals(1, getNestedValue(aggregatedNodeStats, EventStatName.TEXT_EMBEDDING_PROCESSOR_EXECUTIONS));
53+
assertEquals(1, getNestedValue(infoStats, InfoStatName.TEXT_EMBEDDING_PROCESSORS));
54+
} else {
55+
String modelId = null;
56+
try {
57+
modelId = getModelId(getIngestionPipeline(PIPELINE_NAME), TEXT_EMBEDDING_PROCESSOR);
58+
loadModel(modelId);
59+
addDocument(getIndexNameForTest(), "1", TEST_FIELD, TEXT_1, null, null);
60+
addDocument(getIndexNameForTest(), "2", TEST_FIELD, TEXT_1, null, null);
61+
addDocument(getIndexNameForTest(), "3", TEST_FIELD, TEXT_1, null, null);
62+
63+
// Get stats request
64+
String responseBody = executeNeuralStatRequest(new ArrayList<>(), new ArrayList<>());
65+
Map<String, Object> infoStats = parseInfoStatsResponse(responseBody);
66+
Map<String, Object> aggregatedNodeStats = parseAggregatedNodeStatsResponse(responseBody);
67+
68+
assertEquals(3, getNestedValue(aggregatedNodeStats, EventStatName.TEXT_EMBEDDING_PROCESSOR_EXECUTIONS));
69+
assertEquals(1, getNestedValue(infoStats, InfoStatName.TEXT_EMBEDDING_PROCESSORS));
70+
} finally {
71+
wipeOfTestResources(getIndexNameForTest(), PIPELINE_NAME, modelId, null);
72+
}
73+
}
74+
}
75+
}

qa/rolling-upgrade/build.gradle

+33
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ def versionsBelow2_13 = versionsBelow2_12 + "2.12"
6161
def versionsBelow2_14 = versionsBelow2_13 + "2.13"
6262
def versionsBelow2_15 = versionsBelow2_14 + "2.14"
6363
def versionsBelow2_16 = versionsBelow2_15 + "2.15"
64+
def versionsBelow2_17 = versionsBelow2_16 + "2.16"
65+
def versionsBelow2_18 = versionsBelow2_17 + "2.17"
66+
def versionsBelow2_19 = versionsBelow2_18 + "2.18"
67+
def versionsBelow2_20 = versionsBelow2_19 + "2.19"
68+
def versionsBelow3_0 = versionsBelow2_20 + "2.20"
6469

6570
// Task to run BWC tests against the old cluster
6671
task testAgainstOldCluster(type: StandaloneRestIntegTestTask) {
@@ -75,6 +80,13 @@ task testAgainstOldCluster(type: StandaloneRestIntegTestTask) {
7580
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
7681
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")
7782
systemProperty 'tests.security.manager', 'false'
83+
84+
// Excluding stats tests because we introduce this feature in 3.0
85+
if (versionsBelow3_0.any { ext.neural_search_bwc_version.startsWith(it) }){
86+
filter {
87+
excludeTestsMatching "org.opensearch.neuralsearch.bwc.rolling.RestNeuralStatsActionIT.*"
88+
}
89+
}
7890
}
7991

8092
// Part of rolling upgrade. Upgrades one node of the old cluster to new OpenSearch version with upgraded plugin version
@@ -100,6 +112,13 @@ task testAgainstOneThirdUpgradedCluster(type: StandaloneRestIntegTestTask) {
100112
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
101113
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")
102114
systemProperty 'tests.security.manager', 'false'
115+
116+
// Excluding stats tests because we introduce this feature in 3.0
117+
if (versionsBelow3_0.any { ext.neural_search_bwc_version.startsWith(it) }){
118+
filter {
119+
excludeTestsMatching "org.opensearch.neuralsearch.bwc.rolling.RestNeuralStatsActionIT.*"
120+
}
121+
}
103122
}
104123

105124
// Part of rolling upgrade. Upgrades the second node to new OpenSearch version with upgraded plugin version after the
@@ -124,6 +143,13 @@ task testAgainstTwoThirdsUpgradedCluster(type: StandaloneRestIntegTestTask) {
124143
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
125144
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")
126145
systemProperty 'tests.security.manager', 'false'
146+
147+
// Excluding stats tests because we introduce this feature in 3.0
148+
if (versionsBelow3_0.any { ext.neural_search_bwc_version.startsWith(it) }){
149+
filter {
150+
excludeTestsMatching "org.opensearch.neuralsearch.bwc.rolling.RestNeuralStatsActionIT.*"
151+
}
152+
}
127153
}
128154

129155
// Part of rolling upgrade. Upgrades the third node to new OpenSearch version with upgraded plugin version after the
@@ -148,4 +174,11 @@ task testRollingUpgrade(type: StandaloneRestIntegTestTask) {
148174
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
149175
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")
150176
systemProperty 'tests.security.manager', 'false'
177+
178+
// Excluding stats tests because we introduce this feature in 3.0
179+
if (versionsBelow3_0.any { ext.neural_search_bwc_version.startsWith(it) }){
180+
filter {
181+
excludeTestsMatching "org.opensearch.neuralsearch.bwc.rolling.RestNeuralStatsActionIT.*"
182+
}
183+
}
151184
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package org.opensearch.neuralsearch.bwc.rolling;
6+
7+
import org.opensearch.neuralsearch.stats.events.EventStatName;
8+
import org.opensearch.neuralsearch.stats.info.InfoStatName;
9+
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.util.ArrayList;
13+
import java.util.Map;
14+
15+
import static org.opensearch.neuralsearch.util.TestUtils.NODES_BWC_CLUSTER;
16+
17+
public class RestNeuralStatsActionIT extends AbstractRollingUpgradeTestCase {
18+
private static final String PIPELINE_NAME = "nlp-pipeline";
19+
private static final String TEST_FIELD = "passage_text";
20+
private static final String TEXT = "Hello world";
21+
private static final String TEXT_MIXED = "Hello world mixed";
22+
private static final String TEXT_UPGRADED = "Hello world upgraded";
23+
private static final int NUM_DOCS_PER_ROUND = 1;
24+
private static String modelId = "";
25+
26+
// Test rolling-upgrade neural stats action
27+
// Create Text Embedding Processor, Ingestion Pipeline and add document
28+
// Validate stats are correct during upgrade
29+
// When new stats are added, we will also want to validate handling fetching stats from previous versions
30+
// that don't have those stats.
31+
public void testStats_E2EFlow() throws Exception {
32+
waitForClusterHealthGreen(NODES_BWC_CLUSTER, 90);
33+
updateClusterSettings("plugins.neural_search.stats_enabled", true);
34+
35+
switch (getClusterType()) {
36+
case OLD:
37+
modelId = uploadTextEmbeddingModel();
38+
loadModel(modelId);
39+
createPipelineProcessor(modelId, PIPELINE_NAME);
40+
createIndexWithConfiguration(
41+
getIndexNameForTest(),
42+
Files.readString(Path.of(classLoader.getResource("processor/IndexMappings.json").toURI())),
43+
PIPELINE_NAME
44+
);
45+
addDocument(getIndexNameForTest(), "0", TEST_FIELD, TEXT, null, null);
46+
47+
// Get stats request
48+
String responseBody = executeNeuralStatRequest(new ArrayList<>(), new ArrayList<>());
49+
Map<String, Object> infoStats = parseInfoStatsResponse(responseBody);
50+
Map<String, Object> aggregatedNodeStats = parseAggregatedNodeStatsResponse(responseBody);
51+
52+
assertEquals(1, getNestedValue(aggregatedNodeStats, EventStatName.TEXT_EMBEDDING_PROCESSOR_EXECUTIONS));
53+
assertEquals(1, getNestedValue(infoStats, InfoStatName.TEXT_EMBEDDING_PROCESSORS));
54+
break;
55+
case MIXED:
56+
// Get stats request
57+
responseBody = executeNeuralStatRequest(new ArrayList<>(), new ArrayList<>());
58+
infoStats = parseInfoStatsResponse(responseBody);
59+
60+
assertEquals(1, getNestedValue(infoStats, InfoStatName.TEXT_EMBEDDING_PROCESSORS));
61+
break;
62+
case UPGRADED:
63+
try {
64+
// Get stats request
65+
responseBody = executeNeuralStatRequest(new ArrayList<>(), new ArrayList<>());
66+
infoStats = parseInfoStatsResponse(responseBody);
67+
aggregatedNodeStats = parseAggregatedNodeStatsResponse(responseBody);
68+
69+
// After all nodes have be restarted, all event stats should be reset as well
70+
assertEquals(0, getNestedValue(aggregatedNodeStats, EventStatName.TEXT_EMBEDDING_PROCESSOR_EXECUTIONS));
71+
assertEquals(1, getNestedValue(infoStats, InfoStatName.TEXT_EMBEDDING_PROCESSORS));
72+
} finally {
73+
wipeOfTestResources(getIndexNameForTest(), PIPELINE_NAME, modelId, null);
74+
}
75+
break;
76+
default:
77+
throw new IllegalStateException("Unexpected value: " + getClusterType());
78+
}
79+
}
80+
}

src/main/java/org/opensearch/neuralsearch/plugin/NeuralSearch.java

+46-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import static org.opensearch.neuralsearch.settings.NeuralSearchSettings.NEURAL_SEARCH_HYBRID_SEARCH_DISABLED;
88
import static org.opensearch.neuralsearch.settings.NeuralSearchSettings.RERANKER_MAX_DOC_FIELDS;
9+
import static org.opensearch.neuralsearch.settings.NeuralSearchSettings.NEURAL_STATS_ENABLED;
910

1011
import java.util.Arrays;
1112
import java.util.Collection;
@@ -14,12 +15,22 @@
1415
import java.util.Optional;
1516
import java.util.function.Supplier;
1617

18+
import com.google.common.collect.ImmutableList;
19+
import org.opensearch.action.ActionRequest;
20+
import org.opensearch.neuralsearch.settings.NeuralSearchSettingsAccessor;
21+
import org.opensearch.neuralsearch.stats.events.EventStatsManager;
22+
import org.opensearch.neuralsearch.stats.info.InfoStatsManager;
1723
import org.opensearch.transport.client.Client;
1824
import org.opensearch.cluster.metadata.IndexNameExpressionResolver;
25+
import org.opensearch.cluster.node.DiscoveryNodes;
1926
import org.opensearch.cluster.service.ClusterService;
27+
import org.opensearch.common.settings.ClusterSettings;
28+
import org.opensearch.common.settings.IndexScopedSettings;
2029
import org.opensearch.common.settings.Setting;
2130
import org.opensearch.common.settings.Settings;
31+
import org.opensearch.common.settings.SettingsFilter;
2232
import org.opensearch.common.util.FeatureFlags;
33+
import org.opensearch.core.action.ActionResponse;
2334
import org.opensearch.core.common.io.stream.NamedWriteableRegistry;
2435
import org.opensearch.core.xcontent.NamedXContentRegistry;
2536
import org.opensearch.env.Environment;
@@ -55,15 +66,21 @@
5566
import org.opensearch.neuralsearch.query.NeuralQueryBuilder;
5667
import org.opensearch.neuralsearch.query.NeuralSparseQueryBuilder;
5768
import org.opensearch.neuralsearch.query.ext.RerankSearchExtBuilder;
69+
import org.opensearch.neuralsearch.rest.RestNeuralStatsAction;
5870
import org.opensearch.neuralsearch.search.query.HybridQueryPhaseSearcher;
71+
import org.opensearch.neuralsearch.transport.NeuralStatsAction;
72+
import org.opensearch.neuralsearch.transport.NeuralStatsTransportAction;
5973
import org.opensearch.neuralsearch.util.NeuralSearchClusterUtil;
74+
import org.opensearch.neuralsearch.util.PipelineServiceUtil;
6075
import org.opensearch.plugins.ActionPlugin;
6176
import org.opensearch.plugins.ExtensiblePlugin;
6277
import org.opensearch.plugins.IngestPlugin;
6378
import org.opensearch.plugins.Plugin;
6479
import org.opensearch.plugins.SearchPipelinePlugin;
6580
import org.opensearch.plugins.SearchPlugin;
6681
import org.opensearch.repositories.RepositoriesService;
82+
import org.opensearch.rest.RestController;
83+
import org.opensearch.rest.RestHandler;
6784
import org.opensearch.script.ScriptService;
6885
import org.opensearch.search.pipeline.SearchPhaseResultsProcessor;
6986
import org.opensearch.search.pipeline.SearchRequestProcessor;
@@ -82,9 +99,13 @@
8299
public class NeuralSearch extends Plugin implements ActionPlugin, SearchPlugin, IngestPlugin, ExtensiblePlugin, SearchPipelinePlugin {
83100
private MLCommonsClientAccessor clientAccessor;
84101
private NormalizationProcessorWorkflow normalizationProcessorWorkflow;
102+
private NeuralSearchSettingsAccessor settingsAccessor;
103+
private PipelineServiceUtil pipelineServiceUtil;
104+
private InfoStatsManager infoStatsManager;
85105
private final ScoreNormalizationFactory scoreNormalizationFactory = new ScoreNormalizationFactory();
86106
private final ScoreCombinationFactory scoreCombinationFactory = new ScoreCombinationFactory();
87107
public static final String EXPLANATION_RESPONSE_KEY = "explanation_response";
108+
public static final String NEURAL_BASE_URI = "/_plugins/_neural";
88109

89110
@Override
90111
public Collection<Object> createComponents(
@@ -105,7 +126,11 @@ public Collection<Object> createComponents(
105126
NeuralSparseQueryBuilder.initialize(clientAccessor);
106127
HybridQueryExecutor.initialize(threadPool);
107128
normalizationProcessorWorkflow = new NormalizationProcessorWorkflow(new ScoreNormalizer(), new ScoreCombiner());
108-
return List.of(clientAccessor);
129+
settingsAccessor = new NeuralSearchSettingsAccessor(clusterService, environment.settings());
130+
pipelineServiceUtil = new PipelineServiceUtil(clusterService);
131+
infoStatsManager = new InfoStatsManager(NeuralSearchClusterUtil.instance(), settingsAccessor, pipelineServiceUtil);
132+
EventStatsManager.instance().initialize(settingsAccessor);
133+
return List.of(clientAccessor, EventStatsManager.instance(), infoStatsManager);
109134
}
110135

111136
@Override
@@ -117,6 +142,25 @@ public List<QuerySpec<?>> getQueries() {
117142
);
118143
}
119144

145+
@Override
146+
public List<RestHandler> getRestHandlers(
147+
Settings settings,
148+
RestController restController,
149+
ClusterSettings clusterSettings,
150+
IndexScopedSettings indexScopedSettings,
151+
SettingsFilter settingsFilter,
152+
IndexNameExpressionResolver indexNameExpressionResolver,
153+
Supplier<DiscoveryNodes> nodesInCluster
154+
) {
155+
RestNeuralStatsAction restNeuralStatsAction = new RestNeuralStatsAction(settingsAccessor);
156+
return ImmutableList.of(restNeuralStatsAction);
157+
}
158+
159+
@Override
160+
public List<ActionHandler<? extends ActionRequest, ? extends ActionResponse>> getActions() {
161+
return Arrays.asList(new ActionHandler<>(NeuralStatsAction.INSTANCE, NeuralStatsTransportAction.class));
162+
}
163+
120164
@Override
121165
public List<ExecutorBuilder<?>> getExecutorBuilders(Settings settings) {
122166
return List.of(HybridQueryExecutor.getExecutorBuilder(settings));
@@ -167,7 +211,7 @@ public Map<String, org.opensearch.search.pipeline.Processor.Factory<SearchPhaseR
167211

168212
@Override
169213
public List<Setting<?>> getSettings() {
170-
return List.of(NEURAL_SEARCH_HYBRID_SEARCH_DISABLED, RERANKER_MAX_DOC_FIELDS);
214+
return List.of(NEURAL_SEARCH_HYBRID_SEARCH_DISABLED, RERANKER_MAX_DOC_FIELDS, NEURAL_STATS_ENABLED);
171215
}
172216

173217
@Override

0 commit comments

Comments
 (0)