Skip to content

Commit adcdc0d

Browse files
committed
Repsect indices options on _msearch (#35887)
Today we don't respect the indices options when they are passed as request parameters to the `_msearch` endpoint. This is unintuitive and doesn't cause any errors. This changes uses the top-level indices options as the defaults for each sub search-request. Closes #35851
1 parent 4ecfecf commit adcdc0d

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

server/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public static void readMultiLineFormat(BytesReference data,
206206
if (searchType != null) {
207207
searchRequest.searchType(searchType);
208208
}
209-
IndicesOptions defaultOptions = SearchRequest.DEFAULT_INDICES_OPTIONS;
209+
IndicesOptions defaultOptions = searchRequest.indicesOptions();
210210
// now parse the action
211211
if (nextMarker - from > 0) {
212212
try (InputStream stream = data.slice(from, nextMarker - from).streamInput();
@@ -231,7 +231,10 @@ public static void readMultiLineFormat(BytesReference data,
231231
searchRequest.routing(nodeStringValue(value, null));
232232
} else if ("allow_partial_search_results".equals(entry.getKey())) {
233233
searchRequest.allowPartialSearchResults(nodeBooleanValue(value, null));
234+
} else {
235+
// TODO we should not be lenient here and fail if there is any unknown key in the source map
234236
}
237+
235238
}
236239
defaultOptions = IndicesOptions.fromMap(source, defaultOptions);
237240
}

server/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
8080
*/
8181
public static MultiSearchRequest parseRequest(RestRequest restRequest, boolean allowExplicitIndex) throws IOException {
8282
MultiSearchRequest multiRequest = new MultiSearchRequest();
83+
IndicesOptions indicesOptions = IndicesOptions.fromRequest(restRequest, multiRequest.indicesOptions());
84+
multiRequest.indicesOptions(indicesOptions);
8385
if (restRequest.hasParam("max_concurrent_searches")) {
8486
multiRequest.maxConcurrentSearchRequests(restRequest.paramAsInt("max_concurrent_searches", 0));
8587
}

server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.io.IOException;
4242
import java.nio.charset.StandardCharsets;
4343
import java.util.ArrayList;
44+
import java.util.Collections;
4445
import java.util.List;
4546

4647
import static java.util.Collections.singletonList;
@@ -102,6 +103,21 @@ public void testSimpleAddWithCarriageReturn() throws Exception {
102103
assertThat(request.requests().get(0).types().length, equalTo(0));
103104
}
104105

106+
public void testDefaultIndicesOptions() throws IOException {
107+
final String requestContent = "{\"index\":\"test\", \"expand_wildcards\" : \"open,closed\"}}\r\n" +
108+
"{\"query\" : {\"match_all\" :{}}}\r\n";
109+
FakeRestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry())
110+
.withContent(new BytesArray(requestContent), XContentType.JSON)
111+
.withParams(Collections.singletonMap("ignore_unavailable", "true"))
112+
.build();
113+
MultiSearchRequest request = RestMultiSearchAction.parseRequest(restRequest, true);
114+
assertThat(request.requests().size(), equalTo(1));
115+
assertThat(request.requests().get(0).indices()[0], equalTo("test"));
116+
assertThat(request.requests().get(0).indicesOptions(),
117+
equalTo(IndicesOptions.fromOptions(true, true, true, true, SearchRequest.DEFAULT_INDICES_OPTIONS)));
118+
assertThat(request.requests().get(0).types().length, equalTo(0));
119+
}
120+
105121
public void testSimpleAdd2() throws Exception {
106122
MultiSearchRequest request = parseMultiSearchRequest("/org/elasticsearch/action/search/simple-msearch2.json");
107123
assertThat(request.requests().size(), equalTo(5));

0 commit comments

Comments
 (0)