summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java')
-rw-r--r--core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java77
1 files changed, 54 insertions, 23 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
index 9f3c2dda12..bc15198337 100644
--- a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
@@ -41,12 +41,14 @@ import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.script.Script;
+import org.elasticsearch.search.searchafter.SearchAfterBuilder;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
import org.elasticsearch.search.fetch.innerhits.InnerHitsBuilder;
import org.elasticsearch.search.fetch.source.FetchSourceContext;
import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.internal.SearchContext;
import org.elasticsearch.search.rescore.RescoreBuilder;
+import org.elasticsearch.search.rescore.RescoreBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
@@ -93,6 +95,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
public static final ParseField STATS_FIELD = new ParseField("stats");
public static final ParseField EXT_FIELD = new ParseField("ext");
public static final ParseField PROFILE_FIELD = new ParseField("profile");
+ public static final ParseField SEARCH_AFTER = new ParseField("search_after");
private static final SearchSourceBuilder PROTOTYPE = new SearchSourceBuilder();
@@ -134,6 +137,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
private boolean trackScores = false;
+ private SearchAfterBuilder searchAfterBuilder;
+
private Float minScore;
private long timeoutInMillis = -1;
@@ -152,7 +157,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
private BytesReference innerHitsBuilder;
- private List<BytesReference> rescoreBuilders;
+ private List<RescoreBuilder<?>> rescoreBuilders;
private ObjectFloatHashMap<String> indexBoost = null;
@@ -380,6 +385,28 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
return trackScores;
}
+
+ /**
+ * The sort values that indicates which docs this request should "search after".
+ * The sort values of the search_after must be equal to the number of sort fields in the query and they should be
+ * of the same type (or parsable as such).
+ * Defaults to <tt>null</tt>.
+ */
+ public Object[] searchAfter() {
+ if (searchAfterBuilder == null) {
+ return null;
+ }
+ return searchAfterBuilder.getSortValues();
+ }
+
+ /**
+ * Set the sort values that indicates which docs this request should "search after".
+ */
+ public SearchSourceBuilder searchAfter(Object[] values) {
+ this.searchAfterBuilder = new SearchAfterBuilder().setSortValues(values);
+ return this;
+ }
+
/**
* Add an aggregation to perform as part of the search.
*/
@@ -459,20 +486,12 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
return suggestBuilder;
}
- public SearchSourceBuilder addRescorer(RescoreBuilder rescoreBuilder) {
- try {
+ public SearchSourceBuilder addRescorer(RescoreBuilder<?> rescoreBuilder) {
if (rescoreBuilders == null) {
rescoreBuilders = new ArrayList<>();
}
- XContentBuilder builder = XContentFactory.jsonBuilder();
- builder.startObject();
- rescoreBuilder.toXContent(builder, EMPTY_PARAMS);
- builder.endObject();
- rescoreBuilders.add(builder.bytes());
+ rescoreBuilders.add(rescoreBuilder);
return this;
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
}
public SearchSourceBuilder clearRescorers() {
@@ -499,7 +518,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
/**
* Gets the bytes representing the rescore builders for this request.
*/
- public List<BytesReference> rescores() {
+ public List<RescoreBuilder<?>> rescores() {
return rescoreBuilders;
}
@@ -883,8 +902,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
} else if (context.parseFieldMatcher().match(currentFieldName, RESCORE_FIELD)) {
rescoreBuilders = new ArrayList<>();
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
- XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().copyCurrentStructure(parser);
- rescoreBuilders.add(xContentBuilder.bytes());
+ rescoreBuilders.add(RescoreBuilder.parseFromXContent(context));
}
} else if (context.parseFieldMatcher().match(currentFieldName, STATS_FIELD)) {
stats = new ArrayList<>();
@@ -898,6 +916,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
}
} else if (context.parseFieldMatcher().match(currentFieldName, _SOURCE_FIELD)) {
fetchSourceContext = FetchSourceContext.parse(parser, context);
+ } else if (context.parseFieldMatcher().match(currentFieldName, SEARCH_AFTER)) {
+ searchAfterBuilder = SearchAfterBuilder.PROTOTYPE.fromXContent(parser, context.parseFieldMatcher());
} else {
throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].",
parser.getTokenLocation());
@@ -1003,6 +1023,10 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
builder.field(TRACK_SCORES_FIELD.getPreferredName(), true);
}
+ if (searchAfterBuilder != null) {
+ builder.field(SEARCH_AFTER.getPreferredName(), searchAfterBuilder.getSortValues());
+ }
+
if (indexBoost != null) {
builder.startObject(INDICES_BOOST_FIELD.getPreferredName());
assert !indexBoost.containsKey(null);
@@ -1048,10 +1072,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
if (rescoreBuilders != null) {
builder.startArray(RESCORE_FIELD.getPreferredName());
- for (BytesReference rescoreBuilder : rescoreBuilders) {
- XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(rescoreBuilder);
- parser.nextToken();
- builder.copyCurrentStructure(parser);
+ for (RescoreBuilder<?> rescoreBuilder : rescoreBuilders) {
+ rescoreBuilder.toXContent(builder, params);
}
builder.endArray();
}
@@ -1197,9 +1219,9 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
}
if (in.readBoolean()) {
int size = in.readVInt();
- List<BytesReference> rescoreBuilders = new ArrayList<>();
+ List<RescoreBuilder<?>> rescoreBuilders = new ArrayList<>();
for (int i = 0; i < size; i++) {
- rescoreBuilders.add(in.readBytesReference());
+ rescoreBuilders.add(in.readRescorer());
}
builder.rescoreBuilders = rescoreBuilders;
}
@@ -1243,6 +1265,9 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
} else {
builder.profile = false;
}
+ if (in.readBoolean()) {
+ builder.searchAfterBuilder = SearchAfterBuilder.PROTOTYPE.readFrom(in);
+ }
return builder;
}
@@ -1313,8 +1338,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
out.writeBoolean(hasRescoreBuilders);
if (hasRescoreBuilders) {
out.writeVInt(rescoreBuilders.size());
- for (BytesReference rescoreBuilder : rescoreBuilders) {
- out.writeBytesReference(rescoreBuilder);
+ for (RescoreBuilder<?> rescoreBuilder : rescoreBuilders) {
+ out.writeRescorer(rescoreBuilder);
}
}
boolean hasScriptFields = scriptFields != null;
@@ -1359,13 +1384,18 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
if (out.getVersion().onOrAfter(Version.V_2_2_0)) {
out.writeBoolean(profile);
}
+ boolean hasSearchAfter = searchAfterBuilder != null;
+ out.writeBoolean(hasSearchAfter);
+ if (hasSearchAfter) {
+ searchAfterBuilder.writeTo(out);
+ }
}
@Override
public int hashCode() {
return Objects.hash(aggregations, explain, fetchSourceContext, fieldDataFields, fieldNames, from,
highlightBuilder, indexBoost, innerHitsBuilder, minScore, postQueryBuilder, queryBuilder, rescoreBuilders, scriptFields,
- size, sorts, stats, suggestBuilder, terminateAfter, timeoutInMillis, trackScores, version, profile);
+ size, sorts, searchAfterBuilder, stats, suggestBuilder, terminateAfter, timeoutInMillis, trackScores, version, profile);
}
@Override
@@ -1393,6 +1423,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
&& Objects.equals(scriptFields, other.scriptFields)
&& Objects.equals(size, other.size)
&& Objects.equals(sorts, other.sorts)
+ && Objects.equals(searchAfterBuilder, other.searchAfterBuilder)
&& Objects.equals(stats, other.stats)
&& Objects.equals(suggestBuilder, other.suggestBuilder)
&& Objects.equals(terminateAfter, other.terminateAfter)