summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
diff options
context:
space:
mode:
authorOlli Virtanen <olli.virtanen@oath.com>2018-12-03 22:38:11 +0100
committerOlli Virtanen <olli.virtanen@oath.com>2018-12-03 22:38:11 +0100
commit1260b09b1effc5175619a093c727fb52a62276ce (patch)
tree26bad91a2930019766a4f2dc07d83b1d9bb5bb69 /container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
parent9c5f6713a54387b035a565e62ff30bb0a7b54cf8 (diff)
Result merging moved to InterleavedSearchInvoker
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java82
1 files changed, 3 insertions, 79 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
index 4f4e812296a..35475f4b709 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java
@@ -22,13 +22,11 @@ import com.yahoo.search.dispatch.searchcluster.Node;
import com.yahoo.search.grouping.GroupingRequest;
import com.yahoo.search.grouping.request.GroupingOperation;
import com.yahoo.search.query.Ranking;
-import com.yahoo.search.result.Coverage;
import com.yahoo.search.result.ErrorMessage;
import com.yahoo.search.searchchain.Execution;
import edu.umd.cs.findbugs.annotations.NonNull;
import java.io.IOException;
-import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
@@ -151,9 +149,8 @@ public class FastSearcher extends VespaBackEndSearcher {
public Result doSearch2(Query query, QueryPacket queryPacket, CacheKey cacheKey, Execution execution) {
if (dispatcher.searchCluster().groupSize() == 1)
forceSinglePassGrouping(query);
- try(SearchInvoker invoker = getSearchInvoker(query)) {
- List<Result> results = invoker.search(query, queryPacket, cacheKey);
- Result result = mergeResults(results, query, execution);
+ try(SearchInvoker invoker = getSearchInvoker(query, execution)) {
+ Result result = invoker.search(query, queryPacket, cacheKey, execution);
if (query.properties().getBoolean(Ranking.RANKFEATURES, false)) {
// There is currently no correct choice for which
@@ -212,7 +209,7 @@ public class FastSearcher extends VespaBackEndSearcher {
* depends on query properties with the default being an invoker that interfaces with a dispatcher
* on the same host.
*/
- private SearchInvoker getSearchInvoker(Query query) {
+ private SearchInvoker getSearchInvoker(Query query, Execution execution) {
Optional<SearchInvoker> invoker = dispatcher.getSearchInvoker(query, fs4InvokerFactory);
if (invoker.isPresent()) {
return invoker.get();
@@ -264,79 +261,6 @@ public class FastSearcher extends VespaBackEndSearcher {
return Optional.of(local);
}
- private Result mergeResults(List<Result> results, Query query, Execution execution) {
- if (results.size() == 1) {
- return results.get(0);
- }
-
- Result result = new Result(query);
- // keep a separate tally of coverage as the normal merge counts using
- // federated query rules
- Coverage finalCoverage = null;
-
- long answeredActiveDocs = 0;
- long answeredSoonActiveDocs = 0;
-
- for (Result partialResult : results) {
- Coverage coverage = partialResult.getCoverage(true);
-
- if(partialResult.hits().getErrorHit() == null) {
- answeredActiveDocs += coverage.getActive();
- answeredSoonActiveDocs += coverage.getSoonActive();
- }
- if(finalCoverage == null) {
- finalCoverage = coverage;
- } else {
- finalCoverage.mergeWithPartition(coverage);
- }
- result.mergeWith(partialResult);
- result.hits().addAll(partialResult.hits().asUnorderedHits());
- }
- if (finalCoverage != null) {
- adjustDegradedCoverage(finalCoverage, answeredActiveDocs, answeredSoonActiveDocs);
- result.setCoverage(finalCoverage);
- }
-
- if (query.getOffset() != 0 || result.hits().size() > query.getHits()) {
- // with multiple results, each partial result is expected to have
- // offset = 0 to allow correct offset positioning after merge
-
- if (result.getHitOrderer() != null) {
- // Make sure we have the necessary data for sorting
- fill(result, Execution.ATTRIBUTEPREFETCH, execution);
- }
- result.hits().trim(query.getOffset(), query.getHits());
- }
-
- return result;
- }
-
- private void adjustDegradedCoverage(Coverage coverage, long answeredActiveDocs, long answeredSoonActiveDocs) {
- if (coverage.getFull()) {
- return;
- }
- int answered = coverage.getNodes();
- int asked = coverage.getNodesTried();
- int notAnswered = asked - answered;
-
- if (coverage.isDegradedByAdapativeTimeout()) {
- long active = answeredActiveDocs + (notAnswered * answeredActiveDocs / answered);
- long soonActive = answeredSoonActiveDocs + (notAnswered * answeredSoonActiveDocs / answered);
- coverage.setActive(active).setSoonActive(soonActive);
- } else {
- if (asked > answered) {
- int searchableCopies = (int) dispatcher.searchCluster().dispatchConfig().searchableCopies();
- int missingNodes = notAnswered - (searchableCopies - 1);
- if (missingNodes > 0) {
- long active = answeredActiveDocs + (missingNodes * answeredActiveDocs / answered);
- long soonActive = answeredSoonActiveDocs + (missingNodes * answeredSoonActiveDocs / answered);
- coverage.setActive(active).setSoonActive(soonActive);
- coverage.setDegradedReason(com.yahoo.container.handler.Coverage.DEGRADED_BY_TIMEOUT);
- }
- }
- }
- }
-
private static @NonNull Optional<String> quotedSummaryClass(String summaryClass) {
return Optional.of(summaryClass == null ? "[null]" : quote(summaryClass));
}