diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java | 62 |
1 files changed, 18 insertions, 44 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java b/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java index 08d8d54bc53..f0e3e3f3e44 100644 --- a/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/cluster/ClusterSearcher.java @@ -1,8 +1,8 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.cluster; -import com.yahoo.component.annotation.Inject; import com.yahoo.component.ComponentId; +import com.yahoo.component.annotation.Inject; import com.yahoo.component.chain.dependencies.After; import com.yahoo.component.provider.ComponentRegistry; import com.yahoo.container.QrSearchersConfig; @@ -28,10 +28,6 @@ import com.yahoo.vespa.streamingvisitors.VdsStreamingSearcher; import com.yahoo.yolean.Exceptions; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; @@ -57,16 +53,14 @@ public class ClusterSearcher extends Searcher { private final String searchClusterName; - // The set of document types contained in this search cluster - private final Set<String> schemas; + private final SchemaResolver schemaResolver; private final long maxQueryTimeout; // in milliseconds private final long maxQueryCacheTimeout; // in milliseconds private final VespaBackEndSearcher server; private final Executor executor; - private final GlobalPhaseRanker globalPhaseHelper; - private final boolean enableGlobalPhase; + private final GlobalPhaseRanker globalPhaseRanker; @Inject public ClusterSearcher(ComponentId id, @@ -76,16 +70,16 @@ public class ClusterSearcher extends Searcher { DocumentdbInfoConfig documentDbConfig, SchemaInfo schemaInfo, ComponentRegistry<Dispatcher> dispatchers, - GlobalPhaseRanker globalPhaseHelper, + GlobalPhaseRanker globalPhaseRanker, VipStatus vipStatus, VespaDocumentAccess access) { super(id); this.executor = executor; - this.globalPhaseHelper = globalPhaseHelper; int searchClusterIndex = clusterConfig.clusterId(); searchClusterName = clusterConfig.clusterName(); QrSearchersConfig.Searchcluster searchClusterConfig = getSearchClusterConfigFromClusterName(qrsConfig, searchClusterName); - schemas = new LinkedHashSet<>(); + this.globalPhaseRanker = searchClusterConfig.globalphase() ? globalPhaseRanker : null; + this.schemaResolver = new SchemaResolver(documentDbConfig); maxQueryTimeout = ParameterParser.asMilliSeconds(clusterConfig.maxQueryTimeout(), DEFAULT_MAX_QUERY_TIMEOUT); maxQueryCacheTimeout = ParameterParser.asMilliSeconds(clusterConfig.maxQueryCacheTimeout(), DEFAULT_MAX_QUERY_CACHE_TIMEOUT); @@ -94,9 +88,6 @@ public class ClusterSearcher extends Searcher { .com().yahoo().prelude().fastsearch().FastSearcher().docsum() .defaultclass()); - for (DocumentdbInfoConfig.Documentdb docDb : documentDbConfig.documentdb()) - schemas.add(docDb.name()); - String uniqueServerId = UUID.randomUUID().toString(); if (searchClusterConfig.indexingmode() == STREAMING) { server = vdsCluster(uniqueServerId, searchClusterIndex, @@ -106,7 +97,6 @@ public class ClusterSearcher extends Searcher { server = searchDispatch(searchClusterIndex, searchClusterName, uniqueServerId, docSumParams, documentDbConfig, schemaInfo, dispatchers); } - enableGlobalPhase = searchClusterConfig.globalphase(); } private static QrSearchersConfig.Searchcluster getSearchClusterConfigFromClusterName(QrSearchersConfig config, String name) { @@ -159,14 +149,13 @@ public class ClusterSearcher extends Searcher { /** Do not use, for internal testing purposes only. **/ ClusterSearcher(Set<String> schemas, VespaBackEndSearcher searcher, Executor executor) { - this.schemas = schemas; + this.schemaResolver = new SchemaResolver(schemas); searchClusterName = "testScenario"; maxQueryTimeout = DEFAULT_MAX_QUERY_TIMEOUT; maxQueryCacheTimeout = DEFAULT_MAX_QUERY_CACHE_TIMEOUT; server = searcher; this.executor = executor; - this.globalPhaseHelper = null; - this.enableGlobalPhase = false; + this.globalPhaseRanker = null; } /** Do not use, for internal testing purposes only. **/ @@ -232,8 +221,9 @@ public class ClusterSearcher extends Searcher { } private Result doSearch(Searcher searcher, Query query, Execution execution) { + var schemas = schemaResolver.resolve(query, execution); if (schemas.size() > 1) { - return searchMultipleDocumentTypes(searcher, query, execution); + return searchMultipleDocumentTypes(searcher, query, execution, schemas); } else { String docType = schemas.iterator().next(); query.getModel().setRestrict(docType); @@ -247,10 +237,13 @@ public class ClusterSearcher extends Searcher { throw new IllegalStateException("perSchemaSearch must always be called with 1 schema, got: " + restrict.size()); } String schema = restrict.iterator().next(); - Result result = searcher.search(query, execution); - if (globalPhaseHelper != null && enableGlobalPhase) { - globalPhaseHelper.process(query, result, schema); + boolean useGlobalPhase = globalPhaseRanker != null; + if (useGlobalPhase) { + var error = globalPhaseRanker.validateNoSorting(query, schema).orElse(null); + if (error != null) return new Result(query, error); } + Result result = searcher.search(query, execution); + if (useGlobalPhase) globalPhaseRanker.rerankHits(query, result, schema); return result; } @@ -266,8 +259,7 @@ public class ClusterSearcher extends Searcher { } } - private Result searchMultipleDocumentTypes(Searcher searcher, Query query, Execution execution) { - Set<String> schemas = resolveSchemas(query, execution.context().getIndexFacts()); + private Result searchMultipleDocumentTypes(Searcher searcher, Query query, Execution execution, Set<String> schemas) { List<Query> queries = createQueries(query, schemas); if (queries.size() == 1) { return perSchemaSearch(searcher, queries.get(0), execution); @@ -301,25 +293,7 @@ public class ClusterSearcher extends Searcher { } Set<String> resolveSchemas(Query query, IndexFacts indexFacts) { - Set<String> restrict = query.getModel().getRestrict(); - if (restrict == null || restrict.isEmpty()) { - Set<String> sources = query.getModel().getSources(); - return (sources == null || sources.isEmpty()) - ? schemas - : new HashSet<>(indexFacts.newSession(sources, Collections.emptyList(), schemas).documentTypes()); - } else { - return filterValidDocumentTypes(restrict); - } - } - - private Set<String> filterValidDocumentTypes(Collection<String> restrict) { - Set<String> retval = new LinkedHashSet<>(); - for (String docType : restrict) { - if (docType != null && schemas.contains(docType)) { - retval.add(docType); - } - } - return retval; + return schemaResolver.resolve(query, indexFacts); } private List<Query> createQueries(Query query, Set<String> docTypes) { |