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
This commit is contained in:
Simon Willnauer 2018-11-26 14:26:39 +01:00 committed by GitHub
parent b078e2970c
commit ca9b2b9931
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 1 deletions

View File

@ -205,7 +205,7 @@ public class MultiSearchRequest extends ActionRequest implements CompositeIndice
if (searchType != null) {
searchRequest.searchType(searchType);
}
IndicesOptions defaultOptions = SearchRequest.DEFAULT_INDICES_OPTIONS;
IndicesOptions defaultOptions = searchRequest.indicesOptions();
// now parse the action
if (nextMarker - from > 0) {
try (InputStream stream = data.slice(from, nextMarker - from).streamInput();
@ -230,7 +230,10 @@ public class MultiSearchRequest extends ActionRequest implements CompositeIndice
searchRequest.routing(nodeStringValue(value, null));
} else if ("allow_partial_search_results".equals(entry.getKey())) {
searchRequest.allowPartialSearchResults(nodeBooleanValue(value, null));
} else {
// TODO we should not be lenient here and fail if there is any unknown key in the source map
}
}
defaultOptions = IndicesOptions.fromMap(source, defaultOptions);
}

View File

@ -86,6 +86,8 @@ public class RestMultiSearchAction extends BaseRestHandler {
*/
public static MultiSearchRequest parseRequest(RestRequest restRequest, boolean allowExplicitIndex) throws IOException {
MultiSearchRequest multiRequest = new MultiSearchRequest();
IndicesOptions indicesOptions = IndicesOptions.fromRequest(restRequest, multiRequest.indicesOptions());
multiRequest.indicesOptions(indicesOptions);
if (restRequest.hasParam("max_concurrent_searches")) {
multiRequest.maxConcurrentSearchRequests(restRequest.paramAsInt("max_concurrent_searches", 0));
}

View File

@ -41,6 +41,7 @@ import org.elasticsearch.test.rest.FakeRestRequest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static java.util.Collections.singletonList;
@ -102,6 +103,21 @@ public class MultiSearchRequestTests extends ESTestCase {
assertThat(request.requests().get(0).types().length, equalTo(0));
}
public void testDefaultIndicesOptions() throws IOException {
final String requestContent = "{\"index\":\"test\", \"expand_wildcards\" : \"open,closed\"}}\r\n" +
"{\"query\" : {\"match_all\" :{}}}\r\n";
FakeRestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry())
.withContent(new BytesArray(requestContent), XContentType.JSON)
.withParams(Collections.singletonMap("ignore_unavailable", "true"))
.build();
MultiSearchRequest request = RestMultiSearchAction.parseRequest(restRequest, true);
assertThat(request.requests().size(), equalTo(1));
assertThat(request.requests().get(0).indices()[0], equalTo("test"));
assertThat(request.requests().get(0).indicesOptions(),
equalTo(IndicesOptions.fromOptions(true, true, true, true, SearchRequest.DEFAULT_INDICES_OPTIONS)));
assertThat(request.requests().get(0).types().length, equalTo(0));
}
public void testSimpleAdd2() throws Exception {
MultiSearchRequest request = parseMultiSearchRequest("/org/elasticsearch/action/search/simple-msearch2.json");
assertThat(request.requests().size(), equalTo(5));