Skip to content

Commit d1acf44

Browse files
authored
Apply missing request options to the expand phase (#27118)
* Apply missing request options to the expand phase This change adds some missing options to the expand query that builds the inner hits for field collapsing. The following options are now applied to the inner_hits query: * post_filters * preferences * routing Closes #27079 Closes #26649
1 parent 1460a3f commit d1acf44

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java

+18-4
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ public void run() throws IOException {
8888
}
8989
for (InnerHitBuilder innerHitBuilder : innerHitBuilders) {
9090
SearchSourceBuilder sourceBuilder = buildExpandSearchSourceBuilder(innerHitBuilder)
91-
.query(groupQuery);
92-
SearchRequest groupRequest = new SearchRequest(searchRequest.indices())
93-
.types(searchRequest.types())
94-
.source(sourceBuilder);
91+
.query(groupQuery)
92+
.postFilter(searchRequest.source().postFilter());
93+
SearchRequest groupRequest = buildExpandSearchRequest(searchRequest, sourceBuilder);
9594
multiRequest.add(groupRequest);
9695
}
9796
}
@@ -120,6 +119,21 @@ public void run() throws IOException {
120119
}
121120
}
122121

122+
private SearchRequest buildExpandSearchRequest(SearchRequest orig, SearchSourceBuilder sourceBuilder) {
123+
SearchRequest groupRequest = new SearchRequest(orig.indices())
124+
.types(orig.types())
125+
.source(sourceBuilder)
126+
.indicesOptions(orig.indicesOptions())
127+
.requestCache(orig.requestCache())
128+
.preference(orig.preference())
129+
.routing(orig.routing())
130+
.searchType(orig.searchType());
131+
if (orig.isMaxConcurrentShardRequestsSet()) {
132+
groupRequest.setMaxConcurrentShardRequests(orig.getMaxConcurrentShardRequests());
133+
}
134+
return groupRequest;
135+
}
136+
123137
private SearchSourceBuilder buildExpandSearchSourceBuilder(InnerHitBuilder options) {
124138
SearchSourceBuilder groupSource = new SearchSourceBuilder();
125139
groupSource.from(options.getFrom());

core/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java

+40
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.action.search;
2121

2222
import org.elasticsearch.action.ActionListener;
23+
import org.elasticsearch.action.support.IndicesOptions;
2324
import org.elasticsearch.common.document.DocumentField;
2425
import org.elasticsearch.common.settings.Settings;
2526
import org.elasticsearch.common.text.Text;
@@ -242,4 +243,43 @@ public void run() throws IOException {
242243
assertNotNull(reference.get());
243244
assertEquals(1, mockSearchPhaseContext.phasesExecuted.get());
244245
}
246+
247+
public void testExpandRequestOptions() throws IOException {
248+
MockSearchPhaseContext mockSearchPhaseContext = new MockSearchPhaseContext(1);
249+
mockSearchPhaseContext.searchTransport = new SearchTransportService(
250+
Settings.builder().put("search.remote.connect", false).build(), null, null) {
251+
252+
@Override
253+
void sendExecuteMultiSearch(MultiSearchRequest request, SearchTask task, ActionListener<MultiSearchResponse> listener) {
254+
final QueryBuilder postFilter = QueryBuilders.existsQuery("foo");
255+
assertTrue(request.requests().stream().allMatch((r) -> "foo".equals(r.preference())));
256+
assertTrue(request.requests().stream().allMatch((r) -> "baz".equals(r.routing())));
257+
assertTrue(request.requests().stream().allMatch((r) -> postFilter.equals(r.source().postFilter())));
258+
}
259+
};
260+
mockSearchPhaseContext.getRequest().source(new SearchSourceBuilder()
261+
.collapse(
262+
new CollapseBuilder("someField")
263+
.setInnerHits(new InnerHitBuilder().setName("foobarbaz"))
264+
)
265+
.postFilter(QueryBuilders.existsQuery("foo")))
266+
.preference("foobar")
267+
.routing("baz");
268+
269+
SearchHits hits = new SearchHits(new SearchHit[0], 1, 1.0f);
270+
InternalSearchResponse internalSearchResponse = new InternalSearchResponse(hits, null, null, null, false, null, 1);
271+
AtomicReference<SearchResponse> reference = new AtomicReference<>();
272+
ExpandSearchPhase phase = new ExpandSearchPhase(mockSearchPhaseContext, internalSearchResponse, r ->
273+
new SearchPhase("test") {
274+
@Override
275+
public void run() throws IOException {
276+
reference.set(mockSearchPhaseContext.buildSearchResponse(r, null));
277+
}
278+
}
279+
);
280+
phase.run();
281+
mockSearchPhaseContext.assertNoFailure();
282+
assertNotNull(reference.get());
283+
assertEquals(1, mockSearchPhaseContext.phasesExecuted.get());
284+
}
245285
}

0 commit comments

Comments
 (0)