Skip to content

Commit c1f09d3

Browse files
Speedup SearchContext.hasOnlySuggest check and related logic (#112747)
Random find from looking at what we do on the transport thread for search: This check was quite heavy by building the list of sub-searches needlessly. Also, we were needlessly allocating capturing lambdas in the stats logic that used this call.
1 parent f7a0196 commit c1f09d3

File tree

3 files changed

+20
-26
lines changed

3 files changed

+20
-26
lines changed

server/src/main/java/org/elasticsearch/index/search/stats/ShardSearchStats.java

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,36 +56,28 @@ public SearchStats stats(String... groups) {
5656

5757
@Override
5858
public void onPreQueryPhase(SearchContext searchContext) {
59-
computeStats(searchContext, statsHolder -> {
60-
if (searchContext.hasOnlySuggest()) {
61-
statsHolder.suggestCurrent.inc();
62-
} else {
63-
statsHolder.queryCurrent.inc();
64-
}
65-
});
59+
computeStats(
60+
searchContext,
61+
searchContext.hasOnlySuggest() ? statsHolder -> statsHolder.suggestCurrent.inc() : statsHolder -> statsHolder.queryCurrent.inc()
62+
);
6663
}
6764

6865
@Override
6966
public void onFailedQueryPhase(SearchContext searchContext) {
70-
computeStats(searchContext, statsHolder -> {
71-
if (searchContext.hasOnlySuggest()) {
72-
statsHolder.suggestCurrent.dec();
73-
} else {
74-
statsHolder.queryCurrent.dec();
75-
}
76-
});
67+
computeStats(
68+
searchContext,
69+
searchContext.hasOnlySuggest() ? statsHolder -> statsHolder.suggestCurrent.dec() : statsHolder -> statsHolder.queryCurrent.dec()
70+
);
7771
}
7872

7973
@Override
8074
public void onQueryPhase(SearchContext searchContext, long tookInNanos) {
81-
computeStats(searchContext, statsHolder -> {
82-
if (searchContext.hasOnlySuggest()) {
83-
statsHolder.suggestMetric.inc(tookInNanos);
84-
statsHolder.suggestCurrent.dec();
85-
} else {
86-
statsHolder.queryMetric.inc(tookInNanos);
87-
statsHolder.queryCurrent.dec();
88-
}
75+
computeStats(searchContext, searchContext.hasOnlySuggest() ? statsHolder -> {
76+
statsHolder.suggestMetric.inc(tookInNanos);
77+
statsHolder.suggestCurrent.dec();
78+
} : statsHolder -> {
79+
statsHolder.queryMetric.inc(tookInNanos);
80+
statsHolder.queryCurrent.dec();
8981
});
9082
}
9183

@@ -109,8 +101,9 @@ public void onFetchPhase(SearchContext searchContext, long tookInNanos) {
109101

110102
private void computeStats(SearchContext searchContext, Consumer<StatsHolder> consumer) {
111103
consumer.accept(totalStats);
112-
if (searchContext.groupStats() != null) {
113-
for (String group : searchContext.groupStats()) {
104+
var groupStats = searchContext.groupStats();
105+
if (groupStats != null) {
106+
for (String group : groupStats) {
114107
consumer.accept(groupStats(group));
115108
}
116109
}

server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1104,7 +1104,7 @@ public List<SearchExtBuilder> ext() {
11041104
* @return true if the source only has suggest
11051105
*/
11061106
public boolean isSuggestOnly() {
1107-
return suggestBuilder != null && query() == null && knnSearch.isEmpty() && aggregations == null;
1107+
return suggestBuilder != null && knnSearch.isEmpty() && aggregations == null && subSearchSourceBuilders.isEmpty();
11081108
}
11091109

11101110
/**

server/src/main/java/org/elasticsearch/search/internal/SearchContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,8 @@ public void addReleasable(Releasable releasable) { // TODO most Releasables ar
364364
* @return true if the request contains only suggest
365365
*/
366366
public final boolean hasOnlySuggest() {
367-
return request().source() != null && request().source().isSuggestOnly();
367+
var source = request().source();
368+
return source != null && source.isSuggestOnly();
368369
}
369370

370371
/**

0 commit comments

Comments
 (0)