From 0abc28005b2919f666725c2169735cd2a8edd538 Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Thu, 26 Oct 2017 10:33:19 +0200 Subject: [PATCH 1/2] 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 --- .../action/search/ExpandSearchPhase.java | 26 ++++++++++-- .../action/search/ExpandSearchPhaseTests.java | 40 +++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java b/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java index bc673644a0683..ea7ffd95cb68a 100644 --- a/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java +++ b/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java @@ -88,10 +88,9 @@ public void run() throws IOException { } for (InnerHitBuilder innerHitBuilder : innerHitBuilders) { SearchSourceBuilder sourceBuilder = buildExpandSearchSourceBuilder(innerHitBuilder) - .query(groupQuery); - SearchRequest groupRequest = new SearchRequest(searchRequest.indices()) - .types(searchRequest.types()) - .source(sourceBuilder); + .query(groupQuery) + .postFilter(searchRequest.source().postFilter()); + SearchRequest groupRequest = buildExpandSearchRequest(searchRequest, sourceBuilder); multiRequest.add(groupRequest); } } @@ -120,6 +119,25 @@ public void run() throws IOException { } } + private SearchRequest buildExpandSearchRequest(SearchRequest orig, SearchSourceBuilder sourceBuilder) { + SearchRequest groupRequest = new SearchRequest(orig.indices()) + .types(orig.types()) + .source(sourceBuilder) + .indicesOptions(orig.indicesOptions()) + .requestCache(orig.requestCache()); + groupRequest.setMaxConcurrentShardRequests(orig.getMaxConcurrentShardRequests()); + if (orig.preference() != null) { + groupRequest.preference(orig.preference()); + } + if (orig.routing() != null) { + groupRequest.routing(orig.routing()); + } + if (orig.searchType() != null) { + groupRequest.searchType(orig.searchType()); + } + return groupRequest; + } + private SearchSourceBuilder buildExpandSearchSourceBuilder(InnerHitBuilder options) { SearchSourceBuilder groupSource = new SearchSourceBuilder(); groupSource.from(options.getFrom()); diff --git a/core/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java b/core/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java index 81a6359997d7a..b84dafb4f6d5b 100644 --- a/core/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java +++ b/core/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java @@ -20,6 +20,7 @@ package org.elasticsearch.action.search; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.common.document.DocumentField; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; @@ -242,4 +243,43 @@ public void run() throws IOException { assertNotNull(reference.get()); assertEquals(1, mockSearchPhaseContext.phasesExecuted.get()); } + + public void testExpandRequestOptions() throws IOException { + MockSearchPhaseContext mockSearchPhaseContext = new MockSearchPhaseContext(1); + mockSearchPhaseContext.searchTransport = new SearchTransportService( + Settings.builder().put("search.remote.connect", false).build(), null, null) { + + @Override + void sendExecuteMultiSearch(MultiSearchRequest request, SearchTask task, ActionListener listener) { + final QueryBuilder postFilter = QueryBuilders.existsQuery("foo"); + assertTrue(request.requests().stream().allMatch((r) -> "foo".equals(r.preference()))); + assertTrue(request.requests().stream().allMatch((r) -> "baz".equals(r.routing()))); + assertTrue(request.requests().stream().allMatch((r) -> postFilter.equals(r.source().postFilter()))); + } + }; + mockSearchPhaseContext.getRequest().source(new SearchSourceBuilder() + .collapse( + new CollapseBuilder("someField") + .setInnerHits(new InnerHitBuilder().setName("foobarbaz")) + ) + .postFilter(QueryBuilders.existsQuery("foo"))) + .preference("foobar") + .routing("baz"); + + SearchHits hits = new SearchHits(new SearchHit[0], 1, 1.0f); + InternalSearchResponse internalSearchResponse = new InternalSearchResponse(hits, null, null, null, false, null, 1); + AtomicReference reference = new AtomicReference<>(); + ExpandSearchPhase phase = new ExpandSearchPhase(mockSearchPhaseContext, internalSearchResponse, r -> + new SearchPhase("test") { + @Override + public void run() throws IOException { + reference.set(mockSearchPhaseContext.buildSearchResponse(r, null)); + } + } + ); + phase.run(); + mockSearchPhaseContext.assertNoFailure(); + assertNotNull(reference.get()); + assertEquals(1, mockSearchPhaseContext.phasesExecuted.get()); + } } From ccecbc7c054a4ad7312cd31567006f0aa9cf5128 Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Thu, 26 Oct 2017 16:21:12 +0200 Subject: [PATCH 2/2] iter --- .../action/search/ExpandSearchPhase.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java b/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java index ea7ffd95cb68a..53ce4299c546b 100644 --- a/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java +++ b/core/src/main/java/org/elasticsearch/action/search/ExpandSearchPhase.java @@ -124,16 +124,12 @@ private SearchRequest buildExpandSearchRequest(SearchRequest orig, SearchSourceB .types(orig.types()) .source(sourceBuilder) .indicesOptions(orig.indicesOptions()) - .requestCache(orig.requestCache()); - groupRequest.setMaxConcurrentShardRequests(orig.getMaxConcurrentShardRequests()); - if (orig.preference() != null) { - groupRequest.preference(orig.preference()); - } - if (orig.routing() != null) { - groupRequest.routing(orig.routing()); - } - if (orig.searchType() != null) { - groupRequest.searchType(orig.searchType()); + .requestCache(orig.requestCache()) + .preference(orig.preference()) + .routing(orig.routing()) + .searchType(orig.searchType()); + if (orig.isMaxConcurrentShardRequestsSet()) { + groupRequest.setMaxConcurrentShardRequests(orig.getMaxConcurrentShardRequests()); } return groupRequest; }