in server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java [2203:2338]
public ActionRequestValidationException validate(
ActionRequestValidationException validationException,
boolean isScroll,
boolean allowPartialSearchResults
) {
if (retriever() != null) {
validationException = retriever().validate(this, validationException, isScroll, allowPartialSearchResults);
List<String> specified = new ArrayList<>();
if (subSearches().isEmpty() == false) {
specified.add(QUERY_FIELD.getPreferredName());
}
if (knnSearch().isEmpty() == false) {
specified.add(KNN_FIELD.getPreferredName());
}
if (searchAfter() != null) {
specified.add(SEARCH_AFTER.getPreferredName());
}
if (terminateAfter() != DEFAULT_TERMINATE_AFTER) {
specified.add(TERMINATE_AFTER_FIELD.getPreferredName());
}
if (sorts() != null) {
specified.add(SORT_FIELD.getPreferredName());
}
if (rankBuilder() != null) {
specified.add(RANK_FIELD.getPreferredName());
}
if (rescores() != null) {
specified.add(RESCORE_FIELD.getPreferredName());
}
if (specified.isEmpty() == false) {
validationException = addValidationError(
"cannot specify [" + RETRIEVER.getPreferredName() + "] and " + specified,
validationException
);
}
}
if (isScroll) {
if (trackTotalHitsUpTo() != null && trackTotalHitsUpTo() != SearchContext.TRACK_TOTAL_HITS_ACCURATE) {
validationException = addValidationError(
"disabling [track_total_hits] is not allowed in a scroll context",
validationException
);
}
if (from() > 0) {
validationException = addValidationError("using [from] is not allowed in a scroll context", validationException);
}
if (size() == 0) {
validationException = addValidationError("[size] cannot be [0] in a scroll context", validationException);
}
if (rescores() != null && rescores().isEmpty() == false) {
validationException = addValidationError("using [rescore] is not allowed in a scroll context", validationException);
}
if (CollectionUtils.isEmpty(searchAfter()) == false) {
validationException = addValidationError("[search_after] cannot be used in a scroll context", validationException);
}
if (collapse() != null) {
validationException = addValidationError("cannot use `collapse` in a scroll context", validationException);
}
}
if (slice() != null) {
if (pointInTimeBuilder() == null && (isScroll == false)) {
validationException = addValidationError(
"[slice] can only be used with [scroll] or [point-in-time] requests",
validationException
);
}
}
if (from() > 0 && CollectionUtils.isEmpty(searchAfter()) == false) {
validationException = addValidationError("[from] parameter must be set to 0 when [search_after] is used", validationException);
}
if (storedFields() != null) {
if (storedFields().fetchFields() == false) {
if (fetchSource() != null && fetchSource().fetchSource()) {
validationException = addValidationError(
"[stored_fields] cannot be disabled if [_source] is requested",
validationException
);
}
if (fetchFields() != null) {
validationException = addValidationError(
"[stored_fields] cannot be disabled when using the [fields] option",
validationException
);
}
}
}
if (subSearches().size() >= 2 && rankBuilder() == null) {
validationException = addValidationError("[sub_searches] requires [rank]", validationException);
}
if (aggregations() != null) {
validationException = aggregations().validate(validationException);
}
if (rankBuilder() != null) {
int s = size() == -1 ? SearchService.DEFAULT_SIZE : size();
if (s == 0) {
validationException = addValidationError("[rank] requires [size] greater than [0]", validationException);
}
if (s > rankBuilder().rankWindowSize()) {
validationException = addValidationError(
"[rank] requires [rank_window_size: "
+ rankBuilder().rankWindowSize()
+ "]"
+ " be greater than or equal to [size: "
+ s
+ "]",
validationException
);
}
int queryCount = subSearches().size() + knnSearch().size();
if (rankBuilder().isCompoundBuilder() && queryCount < 2) {
validationException = addValidationError(
"[rank] requires a minimum of [2] result sets using a combination of sub searches and/or knn searches",
validationException
);
}
if (isScroll) {
validationException = addValidationError("[rank] cannot be used in a scroll context", validationException);
}
if (rescores() != null && rescores().isEmpty() == false) {
validationException = addValidationError("[rank] cannot be used with [rescore]", validationException);
}
if (suggest() != null && suggest().getSuggestions().isEmpty() == false) {
validationException = addValidationError("[rank] cannot be used with [suggest]", validationException);
}
}
if (rescores() != null) {
for (@SuppressWarnings("rawtypes")
var rescorer : rescores()) {
validationException = rescorer.validate(this, validationException);
}
}
return validationException;
}