summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java')
-rw-r--r--core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java38
1 files changed, 32 insertions, 6 deletions
diff --git a/core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java
index b94f4b3509..48ee5cc288 100644
--- a/core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java
+++ b/core/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java
@@ -34,6 +34,7 @@ import org.elasticsearch.common.settings.Setting.Property;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.Index;
import org.elasticsearch.search.SearchService;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.internal.AliasFilter;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.threadpool.ThreadPool;
@@ -84,6 +85,29 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
return aliasFilterMap;
}
+ private Map<String, Float> resolveIndexBoosts(SearchRequest searchRequest, ClusterState clusterState) {
+ if (searchRequest.source() == null) {
+ return Collections.emptyMap();
+ }
+
+ SearchSourceBuilder source = searchRequest.source();
+ if (source.indexBoosts() == null) {
+ return Collections.emptyMap();
+ }
+
+ Map<String, Float> concreteIndexBoosts = new HashMap<>();
+ for (SearchSourceBuilder.IndexBoost ib : source.indexBoosts()) {
+ Index[] concreteIndices =
+ indexNameExpressionResolver.concreteIndices(clusterState, searchRequest.indicesOptions(), ib.getIndex());
+
+ for (Index concreteIndex : concreteIndices) {
+ concreteIndexBoosts.putIfAbsent(concreteIndex.getUUID(), ib.getBoost());
+ }
+ }
+
+ return Collections.unmodifiableMap(concreteIndexBoosts);
+ }
+
@Override
protected void doExecute(Task task, SearchRequest searchRequest, ActionListener<SearchResponse> listener) {
// pure paranoia if time goes backwards we are at least positive
@@ -107,6 +131,8 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
searchRequest.preference());
failIfOverShardCountLimit(clusterService, shardIterators.size());
+ Map<String, Float> concreteIndexBoosts = resolveIndexBoosts(searchRequest, clusterState);
+
// optimize search type for cases where there is only one shard group to search on
if (shardIterators.size() == 1) {
// if we only have one group, then we always want Q_A_F, no need for DFS, and no need to do THEN since we hit one shard
@@ -125,7 +151,7 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
}
searchAsyncAction((SearchTask)task, searchRequest, shardIterators, startTimeInMillis, clusterState,
- Collections.unmodifiableMap(aliasFilter), listener).start();
+ Collections.unmodifiableMap(aliasFilter), concreteIndexBoosts, listener).start();
}
@Override
@@ -135,6 +161,7 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
private AbstractSearchAsyncAction searchAsyncAction(SearchTask task, SearchRequest searchRequest, GroupShardsIterator shardIterators,
long startTime, ClusterState state, Map<String, AliasFilter> aliasFilter,
+ Map<String, Float> concreteIndexBoosts,
ActionListener<SearchResponse> listener) {
final Function<String, DiscoveryNode> nodesLookup = state.nodes()::get;
final long clusterStateVersion = state.version();
@@ -143,22 +170,22 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
switch(searchRequest.searchType()) {
case DFS_QUERY_THEN_FETCH:
searchAsyncAction = new SearchDfsQueryThenFetchAsyncAction(logger, searchTransportService, nodesLookup,
- aliasFilter, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
+ aliasFilter, concreteIndexBoosts, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
clusterStateVersion, task);
break;
case QUERY_THEN_FETCH:
searchAsyncAction = new SearchQueryThenFetchAsyncAction(logger, searchTransportService, nodesLookup,
- aliasFilter, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
+ aliasFilter, concreteIndexBoosts, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
clusterStateVersion, task);
break;
case DFS_QUERY_AND_FETCH:
searchAsyncAction = new SearchDfsQueryAndFetchAsyncAction(logger, searchTransportService, nodesLookup,
- aliasFilter, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
+ aliasFilter, concreteIndexBoosts, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
clusterStateVersion, task);
break;
case QUERY_AND_FETCH:
searchAsyncAction = new SearchQueryAndFetchAsyncAction(logger, searchTransportService, nodesLookup,
- aliasFilter, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
+ aliasFilter, concreteIndexBoosts, searchPhaseController, executor, searchRequest, listener, shardIterators, startTime,
clusterStateVersion, task);
break;
default:
@@ -177,5 +204,4 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
+ "] to a greater value if you really want to query that many shards at the same time.");
}
}
-
}